android 奇怪的 float 数学

标签 android math floating-point

<分区>

Possible Duplicate:
Why can't decimal numbers be represented exactly in binary?

我从简单的 float 学中得到了非常奇怪的行为。例如。

//create a float with value of 1.0
float f = 1.0;
//take 0.1 from its value
f -=0.1;

前几次当 i 减去 0.1 时,它返回 0.9、0.8、0.7…… 然后由于某种原因它将返回 0.699999999999、0.59999999999 等等。 说这是出乎意料的是轻描淡写。

所以要解决这个问题,我要么需要知道它为什么会这样做 或类似于 Round(float) 的数学函数,它将数字从 0.5999999 舍入到 0.6。

谢谢

编辑, 好的,抱歉问了,哈哈 有可用的修复程序吗?像 Round(float) 之类的东西?

其他编辑: 对于下一个人来说这是一个修复

final DecimalFormat myFormat = new DecimalFormat("#.#");
myFormat.format(myFloatValue)

这会将 myFloatValue 0.599999 更改为 0.6

最佳答案

计算机是有限设备,因此它存储的 float 精度有限。并将它们存储为二进制 float ——相对于基数 2 而不是基数 10。具有有限表示形式的小数不一定具有有限表示形式的二进制数,因此它必须四舍五入存储在有限的计算机中。在此示例中,0.1 将四舍五入为

0.1000000000000000055511151231257827021181583404541015625

当存储为 double float 时,您实际上在每一步中减去的值多于 0.1

关于android 奇怪的 float 数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8152665/

相关文章:

C++ TTmath : Power of?

algorithm - 难以理解渐近符号

javascript - 将范围内的唯一数字推送到 Javascript 中的数组

java - Java 中 float 的值在赋值时发生变化

android - 将 Android 项目与 Team Foundation Server 2010 和分支一起使用。有更简单的方法吗?

android - 多次显示谷歌位置设置对话框

android - Android应用程序中的OutOfMemoryError

java - Android,微调项目不显示

c++ - IEEE754 float 在多大程度上满足 LessThanComparable?

python - decimal.InvalidOperation 在 Series 中四舍五入值时出错