双数据类型的奇怪行为

时间:2014-03-31 08:08:38

标签: java integer double

我的代码如下:

Number inputAmount = NumberFormat.getNumberInstance(Locale.FRANCE).parse("7,10");
double doubleValue = inputAmount.doubleValue();
int intValue = (int) (doubleValue * 100);

System.out.println("Input: " + inputAmount);
System.out.println("Double: " + doubleValue);
System.out.println("Integer: " + intValue);

输出:

Input: 7.1
Double: 7.1
Integer: 710

但是,当inputValue为5,10时,输出为:

Input: 5.1
Double: 5.1
Integer: 509

这只发生在5,10和4,10。我知道它是由于双精度而发生的,但我无法弄清楚具体如何。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

尝试改变:

int intValue = (int) (doubleValue * 100);

为:

int intValue = (int) (doubleValue * 100d);

你的代码已经相当简化,我认为当它增加时,内部转换可能会发生一些奇怪的事情。 100d将强制它在最终转换为int之前乘以两个双打。

答案 1 :(得分:0)

这里的问题是乘法5.1d * 100d产生舍入误差,导致509.99999999999994d。当你将这个双精度转换为整数时,结果显然是509

要了解这里发生了什么,请考虑以下事项:

double doubleValue = 5.1d * 100d; // rounding error...
System.out.println("Double: " + doubleValue);
int intValue = (int) doubleValue;
System.out.println("Integer: " + intValue);

输出:

Double: 509.99999999999994
Integer: 509