【问题标题】:kotlin rem operator doesn't give me correct answerkotlin rem 运算符没有给我正确的答案
【发布时间】:2020-03-14 05:51:55
【问题描述】:
我在我的代码中使用了 android 项目中的 kotlin 余数,但使用这个值我没有得到正确的答案。
变量是:
val vv = 1529.71
val ratio = 0.01
val remainder = vv.rem(ratio)
它必须是 零 但 余数 值是:
4.5363018896793506E-15
我不明白为什么会这样。
【问题讨论】:
标签:
kotlin
floating-point
operators
precision
【解决方案1】:
答案是因为vv 实际上不是 1529.71,而是最接近的 Double,确切的值是 1529.7100000000000363797880709171295166015625(查看它的最简单方法是 println(java.math.BigDecimal(vv)))。如果您想精确表示十进制数字,请使用BigDecimal 并将分数作为字符串传递:
val vv = BigDecimal("1529.71")
val ratio = BigDecimal("0.01")
val remainder = vv.rem(ratio)
在此处阅读有关浮点的更多信息:https://floating-point-gui.de/
【解决方案2】:
在我的例子中,我只需要得到小数点后两个数字的确切数字。
我通过这样做实现了它:
val input = 30.47f
val remainder = (input * 100).toInt() - (input.toInt() * 100)
// remainder = 47 exactly, and not 469999999...
希望这对某人有所帮助。