首页 > 解决方案 > Kotlin double 大于 float 错误表达式解决

问题描述

我遇到了一个问题,我想知道预期的行为是否正确,或者我是否发现了错误。

鉴于这种:

0.08 > 0.08 == false
0.08 > 0.08F == true
0.08 > 0.08F.toDouble() == true

0.08.toFloat() > 0.08F == false

为什么第三个表达式不为假?有任何想法吗?

标签: kotlinfloating-pointdoubleexpression

解决方案


这不是错误,它基于舍入错误。

执行以下代码:

val d = 0.08
val f = 0.08F
val fd = f.toDouble()
print("%.20f".format(d) + "\n")
print("%.20f".format(f) + "\n")
print("%.20f".format(fd))

为您提供以下输出:

0.08000000000000000000
0.07999999821186066000
0.07999999821186066000

如您所见,0.08 双精度值(直到小数点后 20 位)精确到 0.08,而浮点数(由于精度较低)无法精确表示,因此它包含一个舍入值,略低于 0.08

将您的近似(略低)0.08 浮点数转换为双精度数并不会提高您的精度,您仍然有浮点数的舍入误差,这导致转换后的双精度数要低一点。

// 编辑:如果您对浮点数的确切工作原理感兴趣,我建议您查看关于浮点运算的维基百科文章和这个问题:浮点数学是否损坏?


推荐阅读