当前位置: 首页 > 知识库问答 >
问题:

new BigDecimal(double)vs new Big Decimal(String)[重复]

岳玉书
2023-03-14

当<code>BigDecimal</code>与<code>double</code>和<code>bigDecical</code>与<code>String</code>输入一起使用时,似乎会出现不同的结果。

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

我说这是因为双重不精确是错的吗?但既然这是一个大十进制,它不应该是一样的吗?

共有3个答案

暨鹭洋
2023-03-14

Java docs有它的答案。根据BigDecimal(double val)的Java文档

这个构造函数的结果可能有些不可预测。可以假设在Java中编写新的BigDecimal(0.1)会创建一个完全等于0.1(未缩放的值为1,小数位数为1)的BigDecimal,但实际上等于0.1000000000000555111151257827021181583404541015625。这是因为0.1不能精确地表示为双精度。

司寇烨伟
2023-03-14

是的,这是浮点误差。问题在于,在作为参数传递给< code>BigDecimal之前,文字< code>0.333333333和< code > 0.66666666 被表示为double,特别是< code>BigDecimal的构造函数将< code>double作为参数。

标准支持这一点,它说浮点文字默认为,除非另有说明。

陶富
2023-03-14

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

你完全正确,这正是因为double的不精确。

但既然这是一个BigDecimal,那么它不应该是一样的吗?

不,不应该。当您创建新的BigDecimal(0.3333333)时,就会出现错误,因为0.333333333constant中已经嵌入了错误。在这一点上,你无法解决这个表示错误:俗话说的马到那时已经出了谷仓,所以关上门来不及了。

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

 类似资料:
  • 问题内容: 当用的输入用和与输入不同的结果似乎出现。 x输出为 当y是 我说这是因为双重不准确性吗?但是由于这是一个,不应该一样吗? 问题答案: 我说这是因为双重不精确吗? 您绝对正确,这完全是由于的不精确。 但是由于这是一个,不应该一样吗? 不,不应该。在创建时就引入了错误,因为常量已经嵌入了错误。到那时,您无法采取任何措施来修复此表示错误:当时那匹众所周知的马已经离开了谷仓,所以现在关门已经太

  • 问题内容: 我正在尝试将字符串转换为,但是得到了。 我的字串是,现在我将其转换为我所拥有的任何一个。 我如何将其转换为它们中的任何一个。 请帮助我摆脱这个问题。 问题答案: 您必须为数字使用适当的语言环境,例如 版画

  • 现在这是一个已经经历了很多堆栈溢出的线程。这也被其他网站所覆盖,但我仍然无法完全理解。我从这个网站上读到了不同的东西,我在底部链接它们,但现在是问题。 像往常一样,我尝试从文件中读取行: 我不明白为什么我没有得到一个IO[字符串]- 有没有办法在类型上耍花招,可以访问列表中的每个元素,然后创建一个新的纯元素 或者,我仍然可以使用类型执行基本的列表操作(但是到目前为止,我的操作失败了) 我读过的一些

  • 问题内容: 我正在尝试用快速的语言编写BMI程序。我有一个问题:如何将字符串转换为Double? 在Objective-C中,我可以这样: 但是如何用Swift语言实现呢? 问题答案: Swift 4.2+字符串加倍 您应该使用新的类型初始值设定项在String和数字类型(Double,Float,Int)之间进行转换。它会返回一个可选类型(Double?),该类型将具有正确的值;如果String

  • 问题内容: 我怎么能转换,如一个在Java中? 问题答案: 你可以使用将转换为: 对于你的情况,看起来像你想要的:

  • 结果: 为什么piF和piD不相等呢?实际上是什么使两者相同?