如何避免舍入和科学计数法在scala中的双重?

ws51t4hk  于 2023-04-12  发布在  Scala
关注(0)|答案(2)|浏览(283)

给出:

scala> val s =99999999999999947.89
s: Double = 9.9999999999999952E16
scala> f"$s%.2f"
res15: String = 99999999999999952.00

我想要的输出应该是= 99999999999999947.89
如何避免四舍五入和科学记数法。

myss37ts

myss37ts1#

Double数据类型不支持您所追求的精度。最接近的数字99999999999999952是最接近99999999999999947.89的数字,可以表示为Double
这不仅仅是很大的数字的情况。双精度值很快就会开始漂移。你可以在(0.2 + 0.2 + 0.2) != 0.6中看到这个例子。
使用BigDecimal代替。

h43kikqp

h43kikqp2#

在Scala中,高精度的长整型和浮点型会自动转换为科学计数法。
然而,我们通常不希望这种行为,特别是在应用程序之间传递数据时,比如说,json格式,因为接收应用程序可能不知道如何正确解释看起来像这样的字符串:
“1.68047475E+9”
作为浮点数。
我找到的答案是,在Scala中,当你试图将Numeric Type转换为String时,默认的行为是使用科学记数法来保持精度。如果你发现你不希望你的数字被这样表示,你需要在将它转换为字符串之前将它转换为更精确的数据类型。
举个例子

(System.currentTimeMillis()/1000).toDouble.toString

将返回
1680475334
(System.currentTimeMillis()/1000).toFloat.toString
将返回
1.68047539E+9

相关问题