Java中从double到int的转换精度降低
我试着测试下面的代码,它给了我一个434对n的结果,这是我没有预料到的,这种精度损失的原因是什么Java中从double到int的转换精度降低,java,precision,Java,Precision,我试着测试下面的代码,它给了我一个434对n的结果,这是我没有预料到的,这种精度损失的原因是什么 double f = 4.35; int n = (int) (100 * f); // n will be 434 - why? n = (int) Math.round(100*f); // n will be 435 浮点数不能准确表示浮点数 您可以尝试打印它,您将看到100*f=434.999999。该双精度的int值将是434,因为它将截断小数部分 round方法将四舍五入到最接近的i
double f = 4.35;
int n = (int) (100 * f); // n will be 434 - why?
n = (int) Math.round(100*f); // n will be 435
浮点数不能准确表示浮点数 您可以尝试打印它,您将看到
100*f=434.999999
。该双精度的int
值将是434
,因为它将截断小数部分
round
方法将四舍五入到最接近的int
数字,即435
浮点不能准确表示浮点数字
您可以尝试打印它,您将看到100*f=434.999999
。该双精度的int
值将是434
,因为它将截断小数部分
round
方法将四舍五入到最接近的int
数字,即435
浮点不完美。它使用近似值
特别是,double
s不能代表所有数字。正如1/3
不能用有限位数精确地表示为十进制,同样4.35
也不能用有限位数的二进制表示
所以我们得到了四舍五入的结果。接近4.35
,但不完全相等的值。
在这种情况下,它稍微小一些,所以当你把它乘以100,你不会得到435,你会得到几乎435,这是不一样的
当您强制转换到int
时,您会截断结果,因此434999…
将变成434
相反,使用Math.round
时,将434999…
转换为精确的435
(可以精确表示)
如果需要精确表示
4.35
,请查看Java类型。浮点并不完美。它使用近似值
特别是,double
s不能代表所有数字。正如1/3
不能用有限位数精确地表示为十进制,同样4.35
也不能用有限位数的二进制表示
所以我们得到了四舍五入的结果。接近4.35
,但不完全相等的值。
在这种情况下,它稍微小一些,所以当你把它乘以100,你不会得到435,你会得到几乎435,这是不一样的
当您强制转换到int
时,您会截断结果,因此434999…
将变成434
相反,使用Math.round
时,将434999…
转换为精确的435
(可以精确表示)
如果需要精确地表示
4.35
,请查看Java类型。因为4.35不能用double
精确地表示。欢迎使用浮点。请阅读的可能副本,因为4.35不能用double
精确表示。欢迎使用浮点。请阅读可能的副本,谢谢您的回答!为什么100*f=434.999999不是435?@user133466正如roioppi所说,浮点有一个限制。浮点数无法精确表示。因为“f”一开始不是4.35@我已经告诉过你了。谢谢你的回答!为什么100*f=434.999999不是435?@user133466正如roioppi所说,浮点有一个限制。浮点数无法精确表示。因为“f”一开始不是4.35@我已经告诉过你了。