1

在进行一种实现时,我看到在 2 个地方显示的数量有所不同。在进行更多调试时,我发现了此信息。

我有 2 个十进制值,并且都四舍五入到小数点后 2 位。

double value =1091.225;
double value1 =48.125;

System.out.println((double)Math.round(value * 100) / 100);      
System.out.println((double)Math.round(value1 * 100) / 100);


BigDecimal price = new BigDecimal(value);
price = price.setScale(2, RoundingMode.UP);
double val= ((long) (value < 0 ? value * 100 - 0.5 : value * 100 + 0.5)) / 100.0;


BigDecimal price1 = new BigDecimal(value1);
price1 = price1.setScale(2, RoundingMode.UP);
double val1= ((long) (value1 < 0 ? value1 * 100 - 0.5 : value1 * 100 + 0.5)) / 100.0;

System.out.println(val);
System.out.println(val1);

这些是结果

1091.22
48.13
1091.22
48.13

但是,如果我将值更改为

double value =1091.255;
double value1 =48.125;

结果不一样

1091.26
48.13
1091.26
48.13

谁能帮我理解为什么会这样?

4

3 回答 3

2

这是因为浮点数存储在内存中的方式。值1091.2251091.255d没有精确的二进制表示。尝试使用以下语句打印它们的值:

System.out.println(new BigDecimal(1091.225d));
System.out.println(new BigDecimal(1091.255d));

输出将是:

1091.22499999999990905052982270717620849609375
1091.2550000000001091393642127513885498046875

很明显,第一个将舍入为.22,第二个将舍入为.26

于 2013-08-14T12:29:07.500 回答
1

这是因为十进制值未存储为精确值,并且您通过转换为 long 来丢弃小数部分。试试这个以更好地理解:

System.out.println(value * 100 + 0.5);
System.out.println((long)(value * 100 + 0.5));

这打印

109122.99999999999
109122

所以除以 100.0 是 1091.22

但对于其他值,它会打印

109126.00000000001
109126

所以除以 100.0 是 1091.26

于 2013-08-14T12:49:35.343 回答
0

Math.round()是这里的问题。

public static int round(float a) 返回最接近参数的 int。通过加 1/2、取结果的底并将结果转换为 int 类型,将结果四舍五入为整数。换句话说,结果等于表达式的值: (int)Math.floor(a + 0.5f)

希望这可以帮助。

另外,请注意小数点值的精度不准确,因为它们不能完美地以二进制形式表示。

这应该会有所帮助。

于 2013-08-14T12:58:03.110 回答