我需要处理 CSV。用户定义列是否具有浮点型或双精度型。问题是,有时他们将双精度数放入浮点列中,然后对值进行四舍五入,用户稍后才会发现。
如果可能的话,我希望不让这种行为发生。
因此,如果我们尝试在浮点数上存储太大的数字,它不会对其进行四舍五入,而是会引发异常。
我知道有些数字无法正确表示,就像我们所做的那样
0.1 + 0.2
,这不是我想要避免的。
我考虑过将所有内容存储在
BigDecimal
上,但目前这对代码库影响太大,所以我现在宁愿避免它。
编辑:
我知道存在舍入错误。但假设系统使用 IEEE 754 浮点数或双精度数,则表示形式是相同的。因此,系统中的“0.25”浮点数在导入后将继续具有相同的舍入误差。
这就是我想出来的。还没有进行太多测试,需要检查 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