我尝试将一个非常小的数字分配给一个double值,如下所示:
double verySmall = 0.000000001;
9个小数位。出于某种原因,当我将此值乘以10时,我得到的值为0.000000007。我清楚地记得,在原始文本中将这样的大数字写入源代码时存在问题。我是否必须将其包装在某个函数或指令中才能将其正确地提供给编译器?或者在文本中输入如此小的数字可以吗?
答案 0 :(得分:4)
问题在于浮点运算而不是源代码中的文字。它的设计并不准确。最好的方法是不使用内置的两用整数(如果可能的话),具有10个系数的幂,将所有内容相加并在舍入后显示最终有用的数字。
答案 1 :(得分:3)
标准浮点数不是以完美格式存储的,它们以相当紧凑且相当容易执行数学运算的格式存储。它们在精确度非常低的情况下是不精确的。但很快。更多here。
如果你处理的是非常小的数字,你会想看看Objective-C或Cocoa是否提供了类似Java中java.math.BigDecimal类的东西。这正是为了处理精度比速度更重要的数字。如果没有,则可能需要移植它(BigDecimal的源是可用且相当简单的。)
编辑:iKenndac指出NSDecimalNumber class,它是java.math.BigDecimal的类似物。无需端口。答案 2 :(得分:0)
像往常一样,您需要阅读this之类的内容,以便详细了解浮点数如何在计算机上运行。您不能指望能够存储任何具有完美结果的随机分数,就像您不能期望存储任何随机整数一样。底部有位,数量有限。