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

Kotlin中Double转Float的舍入精度异常问题求助

为什么Double转Float时百万级数值的小数部分会失真?

这是因为Float类型的精度限制导致的。

Float是32位单精度浮点数,其中只有23位用于存储尾数(加上隐含的1位,总共能表示24位有效数字)。这意味着:

  • 对于较小的数值(比如1.45、111.45),Float的精度足够覆盖小数部分的细节,所以转换后能得到符合预期的结果。
  • 当数值达到百万级(比如1234567.45)时,Float能表示的最小精度单位(ULP,即最后一位有效数字的权重)会变大。以1234567这个量级为例,Float的ULP是0.5——也就是说,这个范围内的Float只能精确表示形如x.0或x.5的小数,中间的数值无法被精确存储,转换时会自动舍入到最近的可表示值。

1234567.45这个Double值,在转换为Float时,因为无法精确对应到某个Float的可表示值,就会被舍入到最近的1234567.5。

如果你的场景需要保留精确的小数精度,建议继续使用Double类型;如果必须使用Float,需要接受这种精度损失,或者考虑用BigDecimal来处理精确的小数运算。

内容的提问来源于stack exchange,提问作者Mert DEMIRKIRAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:44:58