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
答案 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