当前位置: 首页 > 知识库问答 >
问题:

十进制到低俗的分数,静态编程语言Android

法浩壤
2023-03-14

我一直试图将我的Swift方法转换为静态编程语言,但在这里没有得到任何帮助:十进制到低俗的分数转换方法-需要帮助从Swift转换为静态编程语言

我想我会稍微改变一下我的问题,看看能不能得到一些帮助。我需要逆向工程/代码解释方面的帮助,以便我自己进行转换。无论如何,我会通过这种方式学到更多。

如果有兴趣,完整的代码/故事在上面链接。我几乎要付钱给一个自由职业者来帮我做这件事了。请帮助:)此外,你可能需要知道有一个数组,这个数组有分数英寸的超级和下标输出,这个方法可以舍入。需要解释以下几行:

val whole = number.toInt() // Of course i know what this does :)
val sign = if (whole < 0) -1 else 1 // I converted this myself and believe this is correct Kotlin
val fraction = number - whole.toDouble() // And I know what this does

// need explanation from here down

for (i in 1..fractions.count()) {
    if (abs(fraction) > (fractions[i].1 + fractions[i - 1].1) / 2) {
        if ((fractions[i - 1].1) == (1.0)) run {
            return@run Pair("${whole + sign}", (whole + sign).toDouble())
        } else {
            return ("$whole" $fractions[i - 1].0, ${whole.toDouble() + (sign.toDouble() * fractions[i - 1].1))
        }
    }
}

共有1个答案

汲雅珺
2023-03-14

一般来说,我倾向于在kotlin中编写这样的计算函数作为扩展函数/属性,因为这样可以提高可用性。

package ***

import kotlin.math.abs

/**
 * @author aminography
 */

val Double.vulgarFraction: Pair<String, Double>
    get() {
        val whole = toInt()
        val sign = if (whole < 0) -1 else 1
        val fraction = this - whole

        for (i in 1 until fractions.size) {
            if (abs(fraction) > (fractionValues[i] + fractionValues[i - 1]) / 2) {
                return if (fractionValues[i - 1] == 1.0) {
                    "${whole + sign}" to (whole + sign).toDouble()
                } else {
                    "$whole ${fractions[i - 1]}" to whole + sign * fractionValues[i - 1]
                }
            }
        }
        return "$whole" to whole.toDouble()
    }

val Float.vulgarFraction: Pair<String, Double>
    get() = toDouble().vulgarFraction

private val fractions = arrayOf(
    "",                           // 16/16
    "\u00B9\u2075/\u2081\u2086",  // 15/16
    "\u215E",                     // 7/8
    "\u00B9\u00B3/\u2081\u2086",  // 13/16
    "\u00BE",                     // 3/4
    "\u00B9\u00B9/\u2081\u2086",  // 11/16
    "\u215D",                     // 5/8
    "\u2079/\u2081\u2086",        // 9/16
    "\u00BD",                     // 1/2
    "\u2077/\u2081\u2086",        // 7/16
    "\u215C",                     // 3/8
    "\u2075/\u2081\u2086",        // 5/16
    "\u00BC",                     // 1/4
    "\u00B3/\u2081\u2086",        // 3/16
    "\u215B",                     // 1/8
    "\u00B9/\u2081\u2086",        // 1/16
    ""                            // 0/16
)

private val fractionValues = arrayOf(
    1.0, 
    15.0 / 16, 7.0 / 8, 13.0 / 16, 3.0 / 4, 11.0 / 16,
    5.0 / 8, 9.0 / 16, 1.0 / 2, 7.0 / 16, 3.0 / 8,
    5.0 / 16, 1.0 / 4, 3.0 / 16, 1.0 / 8, 1.0 / 16,
    0.0
)
val rand = java.util.Ranhtml" target="_blank">dom()
repeat(10) {
    val sign = if (rand.nextBoolean()) 1 else -1
    val number = rand.nextDouble() * rand.nextInt(100) * sign
    val vulgar = number.vulgarFraction
    println("Number: $number , Vulgar: ${vulgar.first} , Rounded: ${vulgar.second}")
}

输出:

号码:17.88674468660217,粗俗:17⅞ , 四舍五入:17.875
数字:-56.98489542592821,粗俗:-57,四舍五入:-57.0
数字:39.275953137210614,粗俗:39¼,四舍五入:39.25
数字:13.422939071442359,粗俗:13⁷/₁₆ , 四舍五入:13.4375
数字:-56.70735924226373,粗俗:-56/₁₆ , 四舍五入:-56.6875
数字:22.657555818202972,粗俗:22/₁₆ , 四舍五入:22.6875
数字:2.951680466645306,粗俗:2⁵/₁₆ , 四舍五入:2.9375
数字:-8.8311628631306,粗俗:-8/₁₆ , 四舍五入:-8.8125
数字:28.639946409572655,粗俗:28⅝ , 四舍五入:28.625
数字:-28.43944783884085,粗俗:-28⁷/₁₆ , 四舍五入:-28.4375

对整个逻辑的解释有点难,我会试着让它更清楚一点。注意,在下面的片段中,为了简化,我已经用fractionValue替换了fractionValues[i-1]

// First look at the 'fractions' array. It starts from 16/16=1 down to 0/16=0.
// So it covers all the possible 16 cases for dividing a number by 16. 
// Note that 16/16=1 and 0/16=0 are the same in terms of division residual.

for (i in 1 until fractions.size) {
    // Here, we are searching for the proper fraction that is the nearest one to the
    // actual division residual. 
    // So, '|fraction| > (fractionValues[i] + fractionValues[i - 1]) / 2' means
    // that the fraction is closer to the greater one in the 'fractionValues' array 
    // (i.e. 'fractionValues[i - 1]').
    // Consider that we always want to find the proper 'fractionValues[i - 1]' and not 
    // 'fractionValues[i]' (According to the index of the 'for' loop which starts 
    // from 1, and not 0).

    if (abs(fraction) > (fractionValues[i] + fractionValues[i - 1]) / 2) {

        val fractionValue = fractionValues[i - 1]
        // Here we've found the proper fraction value (i.e. 'fractionValue').

        return if (fractionValue == 1.0) {
            // 'fractionValue == 1.0' means that the actual division residual was greater 
            // than 15/16 but closer to 16/16=1. So the final value should be rounded to
            // the nearest integer. Consider that in this case, the nearest integer for a
            // positive number is one more and for a negative number, one less. Finally, 
            // the summation with 'sign' does it for us :)

            "${whole + sign}" to (whole + sign).toDouble()
        } else {
            // Here we have 'fractionValue < 1.0'. The only thing is to calculate the 
            // rounded value which is the sum of 'whole' and the discovered 'fractionValue'.
            // As the value could be negative, by multiplying the 'sign' to the 
            // 'fractionValue', we will be sure that the summation is always correct.

            "$whole $fractionValue" to whole + sign * fractionValue
        }
    }
}

// Finally, if we are not able to find a proper 'fractionValue' for the input number, 
// it means the number had an integer value.
return "$whole" to whole.toDouble()
 类似资料:
  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 我需要复制一个文本到剪贴板,所以我使用了一个代码,我已经使用了在主活动: 问题是,这段代码在活动上运行良好,但(显然)在片段上运行不好。 在上: 类型推断失败:趣味getSystemService(p0: Context, p1: Class): T?不能应用于(字符串) 在上: 类型不匹配:推断的类型是String,但需要上下文 我试过了 但不起作用

  • 这两个代码片段有什么区别?以及如何决定使用哪一个? 和 有了这两个代码,我可以像这样通过索引访问它

  • 我有一个使用Kotlin 1.0版的Android项目。Android Studio中的0-beta-1038。 我可以在不同的部分使用Kotlin运行它,它在模拟器中编译并工作,但当我尝试使用ReadWriteProperty时,它会给出以下错误消息: 未解析的引用:ReadWriteProperty 类称为首选Utils.kt: build.grade(模块:app) build.grade(

  • 正如标题所说,我正在尝试将Java和Kotlin混合在一个项目中。这里有一个很好的例子。混合java kotlin hello world。除了kotlin在src/main/Java/somepackage/SomeClass中找不到我的任何Java类之外,所有的东西都正常工作。Java语言 这是什么原因? 我的身材。gradle看起来像这样 而不是开始尝试在更大的项目上实现这一点。我试图通过创