尝试将数字放在将被舍入并失去精度的浮点数上时抛出异常

问题描述 投票:0回答:1

我需要处理 CSV。用户定义列是否具有浮点型或双精度型。问题是,有时他们将双精度数放入浮点列中,然后对值进行四舍五入,用户稍后才会发现。

如果可能的话,我希望不让这种行为发生。

因此,如果我们尝试在浮点数上存储太大的数字,它不会对其进行四舍五入,而是会引发异常。

我知道有些数字无法正确表示,就像我们所做的那样

0.1 + 0.2
,这不是我想要避免的。

我考虑过将所有内容存储在

BigDecimal
上,但目前这对代码库影响太大,所以我现在宁愿避免它。

编辑:

我知道存在舍入错误。但假设系统使用 IEEE 754 浮点数或双精度数,则表示形式是相同的。因此,系统中的“0.25”浮点数在导入后将继续具有相同的舍入误差。

java ieee-754
1个回答
0
投票

这就是我想出来的。还没有进行太多测试,需要检查 BigDcimal

compareTo
equals
是否更有意义。我从这个问题得到了限制。

import java.math.BigDecimal;

static boolean isRounded(String strNumber) {
float f = Float.parseFloat(strNumber);
BigDecimal bdf = BigDecimal.valueOf(f);
BigDecimal bd = new BigDecimal(strNumber);

// return bd.equals(bdf);
return bd.compareTo(bdf) != 0;
}

String ok = "16777216";
String nok = "16777217";
System.out.println("is rounded " + isRounded(ok)); // false
System.out.println("is rounded " + isRounded(nok)); // true
© www.soinside.com 2019 - 2024. All rights reserved.