当前位置: 首页 > 面试题库 >

new BigDecimal(double)与new BigDecimal(String)

荆哲
2023-03-14
问题内容

BigDecimal用的输入用doubleBigDecimal与输入String不同的结果似乎出现。

BigDecimal a = new BigDecimal(0.333333333);
BigDecimal b = new BigDecimal(0.666666666);

BigDecimal c = new BigDecimal("0.333333333");
BigDecimal d = new BigDecimal("0.666666666");

BigDecimal x = a.multiply(b);
BigDecimal y = c.multiply(d);

System.out.println(x);
System.out.println(y);

x输出为

0.222222221777777790569747304508155316795087227497352441864147715340493949298661391367204487323760986328125

当y是

0.222222221777777778

我说这是因为双重不准确性吗?但是由于这是一个BigDecimal,不应该一样吗?


问题答案:

我说这是因为双重不精确吗?

您绝对正确,这完全是由于double的不精确。

但是由于这是一个BigDecimal,不应该一样吗?

不,不应该。在创建时就引入了错误new BigDecimal(0.333333333),因为0.333333333常量已经嵌入了错误。到那时,您无法采取任何措施来修复此表示错误:当时那匹众所周知的马已经离开了谷仓,所以现在关门已经太迟了。

String另一方面,当您传递一个时,十进制表示形式与该字符串完全匹配,因此您将获得不同的结果。



 类似资料:
  • 问题内容: 我很好奇Java的类和double的原始类型之间的性能差异是什么。因此,我创建了一个基准测试,发现类类型比原始类型慢3到7倍。(在本地计算机OSX上为3x,在ideone上为7x) 这是测试: http://ideone.com/fDizDu 那么为什么Double类型要慢得多呢?为什么还要实施它以允许数学运算符? 问题答案: 那么为什么Double类型要慢得多呢? 因为该值包装在需要

  • 问题内容: 我有一个双重数组。我尝试了如下操作 它不打印任何内容。然后我把它做成一个双数组 它打印。 有人可以解释为什么存在这种差异吗? 问题答案: 您的第一个调用实际上是返回-将参数自动装箱,因为a 不是…。泛型不允许将基本类型用作类型参数。 如果您要将a 转换为,则需要手动执行,或使用第三方库来执行。例如: 请注意,与数组的任何后续更改不同,它 不会 反映在列表中,反之亦然-它是副本,而不是视

  • 问题内容: 我知道这是一个包装类,它包装数字。今天,我看到了另一个主要区别: 我真奇怪! 因此,如果每次使用,我们都必须执行以下操作: 我无法解释为什么Double直接将比较做错了。请为我解释。 问题答案: 而在技术上两个不同的对象和运营商只比较引用。 更好,因为它比较值而不是引用。但是仍然不理想。直接比较浮点值应始终将一些误差(ε)考虑在内()。 注意: 这里的比较会产生,但是比较复杂(内部缓存

  • 描述 (Description) C库函数double fmod(double x, double y)返回x的余数除以y 。 声明 (Declaration) 以下是fmod()函数的声明。 double fmod(double x, double y) 参数 (Parameters) x - 这是具有除法分子iex的浮点值 y - 这是具有除法分母iey的浮点值 返回值 (Return Va

  • 描述 (Description) C库函数double pow(double x, double y)将x提升为y的幂,即x y 。 声明 (Declaration) 以下是pow()函数的声明。 double pow(double x, double y) 参数 (Parameters) x - 这是浮点基值。 y - 这是浮点功率值。 返回值 (Return Value) 此函数返回将x提升

  • 描述 (Description) C库函数double modf(double x, double *integer)返回小数部分(小数点后的部分),并将整数设置为整​​数分量。 声明 (Declaration) 以下是modf()函数的声明。 double modf(double x, double *integer) 参数 (Parameters) x - 这是浮点值。 integer -