You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中Double与Float比较结果异常问题咨询

解惑:浮点数精度差异导致的比较结果异常

这问题问到点子上了!本质是二进制浮点数的精度存储特性在作祟,咱们逐个拆解你遇到的四个表达式:

1. 0.08 > 0.08 == false

这个很好理解:你比较的是同一个double类型的数值,两者在内存里的存储完全一致,自然0.08不大于0.08,结果为false。

2. 0.08 > 0.08F == true

这里要注意:0.08默认是double类型(64位浮点数),0.08F是float类型(32位浮点数)。
十进制的0.08转成二进制是无限循环的,就像十进制没法精确表示1/3一样,所以无论是float还是double都只能存近似值,但float的精度更低(尾数只有23位,double有52位),所以0.08F的近似值会比真实的0.08更小一点。当两者比较时,0.08F会被自动提升为double类型,但它的近似值并没有改变,所以double类型的0.08(更接近真实值)会大于这个提升后的数值,结果为true。

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

你可能以为把0.08F转成double后会和原生的0.08相等,但实际上:
0.08F.toDouble()只是把float存储的近似值扩展成double类型——因为float的尾数只有23位,转成double时会在后面补0填充到52位,并没有改变原来的近似值。这个扩展后的double值依然比原生的0.08(double类型的更精确近似值)要小,所以比较结果还是true。

4. 0.08.toFloat() > 0.08F == false

这里0.08.toFloat()是把double类型的0.08转成float,和直接写0.08F的过程是一样的:都是将十进制0.08转成精度更低的float近似值,所以两者在内存里的存储完全一致,自然不满足大于关系,结果为false。

总结一下:关键是不同精度的浮点数对同一个十进制数的近似程度不同,转类型只是扩展或截断存储位,不会改变原本的近似值,这才导致了看似矛盾的比较结果。

内容的提问来源于stack exchange,提问作者Dennis Schröder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:08:12