(int)(33.46639 * 1000000)
返回 33466389
为什么会这样呢?
(int)(33.46639 * 1000000)
返回 33466389
为什么会这样呢?
浮点数计算并非完美。 每个程序员都应该知道 关于它的相关内容。
许多人认为浮点运算是一门神秘的学科,这令人感到惊讶,因为在计算机系统中,浮点数无处不在。几乎每种语言都有浮点数据类型;从个人电脑到超级计算机,都配备了浮点加速器;大多数编译器将被调用来编译浮点算法;几乎所有操作系统都必须响应浮点异常,如溢出。本文介绍了浮点数的那些方面,对计算机系统设计者具有直接影响。它从浮点表示和舍入误差的背景开始,继续讨论IEEE浮点标准,并以许多例子结束,说明计算机制造商如何更好地支持浮点数。
...
将无限多的实数压缩到有限数量的位中需要近似表示。尽管有无限多个整数,在大多数程序中,整数计算的结果可以存储在32位中。相比之下,对于任何固定数量的位,大多数实数计算将产生无法使用那么多位精确表示的量。因此,浮点数计算的结果通常必须进行舍入,以适应其有限表示形式。这种舍入误差是浮点计算的特征。
双精度浮点数不是精确的,因此内部的33.46639实际上存储为33.466389。
编辑:正如Richard所说,这是浮点数据(以二进制形式存储在有限的位数中),因此并非完全如此。
33.46638999999999697365637985058128833770751953125
。 - Stephen Canondecimal
类型,它使用十进制浮点数算术,这样它将按照你的期望工作。 - Gabedecimal
作为一个浮点类型的例子,它会给出正确的答案。 - Gabe33466390
,那是因为double
没有无限精度,这个数字不能在二进制中被准确表示。decimal
替换double
((int)(33.46639m * 1000000)
),它将等于33466390
,因为decimal
是以十进制计算的。因为33.46639无法在有限数量的二进制数字中精确表示。 33.46639 * 1000000的实际结果为33466389.9999999962747097015380859375。强制转换将其截断为33466389。
float
或double
值强制转换为int
会丢弃小数部分,因此您会丢失信息。 - Seth