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

Scala的BigDecimal类中的doubleValue函数实际上是什么,scala,bigdecimal,Scala,Bigdecimal,scala中的BigDecimal类包含一个双值函数。Double是64位大小…但是BigDecimal可以包含任意数量的数字和小数点后的任意数量的数字 我试着在scala REPL中查看它返回了什么 实际上,在编写程序时,找到BigDecimal的平方根以提供平方根的初始猜测是很有用的。我的疑问是,一个双精度计数器如何存储一个大的十进制数。有人能澄清这一点吗 scala> BigDecimal("1928374899839383826178873384782728848228437167

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

我试着在scala REPL中查看它返回了什么

实际上,在编写程序时,找到BigDecimal的平方根以提供平方根的初始猜测是很有用的。我的疑问是,一个双精度计数器如何存储一个大的十进制数。有人能澄清这一点吗

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

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

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

  java.lang.Double.POSITIVE_INFINITY
  java.lang.Double.NEGATIVE_INFINITY

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

  java.lang.Double.POSITIVE_INFINITY
  java.lang.Double.NEGATIVE_INFINITY

它相当于Java,其文档记录如下:

将此BigDecimal转换为double。这种转换类似于Java语言中定义的从double到float的缩小原语转换™ 语言规范:如果此BigDecimal的大小太大,表示为double,它将根据需要转换为double.NEGATIVE_∞或double.POSITIVE_∞。请注意,即使返回值是有限的,此转换也可能丢失有关BigDecimal值精度的信息

它实际上似乎并没有这样说,但它应该返回最接近
BigDecimal
double
。请注意,对于足够大的数字,最近的
double
s之间存在较大的间隙

我的疑问是,一个双精度计数器如何存储一个大的十进制数

在大多数情况下,这是不可能的。如果将
BigDecimal
转换为
Double
并返回:
BigDecimal(aBigDecimal.doubleValue)
,结果通常不等于
aBigDecimal
。甚至有一种
isExactDouble
方法来测试它


但是对于这个不重要的特定用途(平方根的初始猜测)(OTOH,可能是无穷大,但你可以测试一下。)

它相当于Java,它被记录为:

将此BigDecimal转换为double。这种转换类似于Java语言中定义的从double到float的缩小原语转换™ 语言规范:如果此BigDecimal的大小太大,表示为double,它将根据需要转换为double.NEGATIVE_∞或double.POSITIVE_∞。请注意,即使返回值是有限的,此转换也可能丢失有关BigDecimal值精度的信息

它实际上似乎并没有这样说,但它应该返回最接近
BigDecimal
double
。请注意,对于足够大的数字,最近的
double
s之间存在较大的间隙

我的疑问是,一个双精度计数器如何存储一个大的十进制数

在大多数情况下,这是不可能的。如果将
BigDecimal
转换为
Double
并返回:
BigDecimal(aBigDecimal.doubleValue)
,结果通常不等于
aBigDecimal
。甚至有一种
isExactDouble
方法来测试它


但是对于这个不重要的特定用途(平方根的初始猜测)(OTOH,可能是无穷大,但你可以测试一下)。

如果你尝试
Double.MaxValue
你会看到它等于
1.7976931348623157E308
。如果您的
BigDecimal
大于
Double.MaxValue
那么
doubleValue()
将返回
Double.Infinity
如果您尝试
Double.MaxValue
您将看到它等于
1.7976931348623157E308
。如果您的
BigDecimal
大于
Double.MaxValue
,则
doubleValue()
将返回
Double.Infinity
@AndreyTyukin否,我看到了实际的方法体+注释,并更新了answer@AndreyTyukin不,我看到了实际的方法主体+注释,并更新了答案