为什么我们需要先将double转换为字符串,然后才能将其转换为BigDecimal?

起搏器:

Apache Commons的回合来源如下所示:

public static double round(double x, int scale, int roundingMethod) {
    try {
        return (new java.math.BigDecimal(Double.toString(x)).setScale(scale, roundingMethod)).doubleValue();
    } catch (NumberFormatException ex) {
        if (Double.isInfinite(x)) {
            return x;
        } else {
            return Double.NaN;
        }
    }
}

我想知道BigDecimal为什么创建为什么他们选择将double转换为字符串(使用Double.toString)而不是简单地使用double本身?

换句话说,这有什么问题?

public static double round(double x, int scale, int roundingMethod) {
    try {
        return (new java.math.BigDecimal(x).setScale(scale, roundingMethod)).doubleValue();
    } catch (NumberFormatException ex) {
        if (Double.isInfinite(x)) {
            return x;
        } else {
            return Double.NaN;
        }
    }
}
法比安·巴尼(Fabian Barney):

这是因为BigDecimal(double)构造函数的结果是不可预测的,如javadoc中所述。

有人可能会假设用Java编写新的BigDecimal(0.1)会创建一个BigDecimal,它精确地等于0.1(未缩放的值1,小数位数为1),但实际上等于0.1000000000000000055555511151231257827021181583404541015625

另一方面,String构造函数是完全可预测的:就像期望的那样,编写新的BigDecimal(“ 0.1”)会创建一个完全等于0.1的BigDecimal。因此,通常建议优先使用String构造函数。

测试用例:

System.out.println(java.math.BigDecimal.valueOf(0.1).toString());
System.out.println(new java.math.BigDecimal(0.1).toString());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

BigDecimal转换为字符串

为什么我们不能将List <A>强制转换为List <B>

为什么不能将此字符串转换为文字?

检查日期字符串是什么区域性,然后将其转换为DateTime

为什么我们从MultiByte转换为WideChar?

为什么在Kotlin中不能将字符串“ 20L”转换为Long?

为什么Ecto的`cast`不能将整数转换为字符串?

为什么在将其转换为Promise之前,我们不需要在此处订阅可观察的东西?

为什么从字符串转换为整数,然后再转换为字符串会引发异常?

为什么我们需要将本机Hibernate异常转换为Spring DataAccessExceptio

我们如何在PHP中将字符串转换为数组?

为什么我们需要将可选选项显式转换为Any?

toFixed正在转换为字符串。我们如何转换数字?

我们如何在AngularJs中将整数转换为字符串

我们如何在Java中将字符串转换为用户定义的对象

为什么我的JavaScript程序没有将其转换为整数而不是字符串?

我如何才能将其转换为unicode

我们不能将int转换为boolean吗?

当某些项目包含空格时,为什么不能将字符串变量转换为数组?

为什么不能将此字符串转换为URL?

需要转义哪些字符才能将其转换为字符串?

为什么我不能将 lxml.etree._ElementUnicodeResult 转换为字符串?

为什么将整数转换为字符串,将其切片,然后将其转换回整数会给我这个 TypeError?

将字符串转换为 BigDecimal

为什么 isNaN() 不能将空字符串转换为数字?

为什么我不能将其转换为 Int?

不能将字符串转换为浮点数然后转换为整数?

为什么我不能将此列表作为字符串转换为 Common Lisp 中的真实列表?

我是否需要将整数参数转换为字符串才能使用 varchar 索引?