Scala的BigDecimal类中的doubleValue函数实际上是什么

时间:2018-07-06 13:32:52

标签: scala bigdecimal

scala中的BigDecimal类包含一个doubleValue函数。 Double是64位大小...但是BigDecimal可以包含任意数量的数字和小数点后的任意数量的数字。

我尝试在scala REPL中查看返回的内容。

实际上,在编写程序中找到BigDecimal的平方根以提供平方根的初始猜测非常有用。我的疑问是双精度如何存储BigDecimal。有人可以澄清吗?

scala> BigDecimal("192837489983938382617887338478272884822843716738884788278828947828784888.1993883727818837818811881818818"
)
res6: scala.math.BigDecimal = 192837489983938382617887338478272884822843716738884788278828947828784888.199388372781883781881
1881818818

scala> res6.doubleValue()
res7: Double = 1.928374899839384E71

2 个答案:

答案 0 :(得分:2)

它等效于Java的method with the same name,其记录为:

  

将此BigDecimal转换为双精度。此转换类似于Java™语言规范中定义的从double到float的变窄原始转换:如果此BigDecimal的幅度太大,则表示为double,它将适当地转换为Double.NEGATIVE_INFINITY或Double.POSITIVE_INFINITY。请注意,即使返回值是有限的,此转换也可能会丢失有关BigDecimal值精度的信息。

实际上似乎并没有这么说,但是它应该返回最接近double的{​​{1}}。请注意,对于足够大的数字,最接近的BigDecimal之间存在较大的差距。

  

我的疑问是,双精度数如何存储BigDecimal。

在大多数情况下不能。如果将double转换为BigDecimal并返回:Double,则结果通常将不等于BigDecimal(aBigDecimal.doubleValue)。甚至还有一种aBigDecimal方法来对其进行测试。

但是对于这种特定用途(对平方根的初步猜测)并不重要(OTOH,可能是无穷大,但您可以对其进行测试)。

答案 1 :(得分:0)

转换是有损的。如果该值不能表示为双精度数,则结果可能是

之一
  java.lang.Double.POSITIVE_INFINITY
  java.lang.Double.NEGATIVE_INFINITY
相关问题