给出:
scala> val s =99999999999999947.89 s: Double = 9.9999999999999952E16 scala> f"$s%.2f" res15: String = 99999999999999952.00
我想要的输出应该是= 99999999999999947.89如何避免四舍五入和科学记数法。
myss37ts1#
Double数据类型不支持您所追求的精度。最接近的数字99999999999999952是最接近99999999999999947.89的数字,可以表示为Double。这不仅仅是很大的数字的情况。双精度值很快就会开始漂移。你可以在(0.2 + 0.2 + 0.2) != 0.6中看到这个例子。使用BigDecimal代替。
Double
(0.2 + 0.2 + 0.2) != 0.6
BigDecimal
h43kikqp2#
在Scala中,高精度的长整型和浮点型会自动转换为科学计数法。然而,我们通常不希望这种行为,特别是在应用程序之间传递数据时,比如说,json格式,因为接收应用程序可能不知道如何正确解释看起来像这样的字符串:“1.68047475E+9”作为浮点数。我找到的答案是,在Scala中,当你试图将Numeric Type转换为String时,默认的行为是使用科学记数法来保持精度。如果你发现你不希望你的数字被这样表示,你需要在将它转换为字符串之前将它转换为更精确的数据类型。举个例子
(System.currentTimeMillis()/1000).toDouble.toString
将返回1680475334(System.currentTimeMillis()/1000).toFloat.toString将返回1.68047539E+9
1680475334
1.68047539E+9
2条答案
按热度按时间myss37ts1#
Double
数据类型不支持您所追求的精度。最接近的数字99999999999999952是最接近99999999999999947.89的数字,可以表示为Double
。这不仅仅是很大的数字的情况。双精度值很快就会开始漂移。你可以在
(0.2 + 0.2 + 0.2) != 0.6
中看到这个例子。使用
BigDecimal
代替。h43kikqp2#
在Scala中,高精度的长整型和浮点型会自动转换为科学计数法。
然而,我们通常不希望这种行为,特别是在应用程序之间传递数据时,比如说,json格式,因为接收应用程序可能不知道如何正确解释看起来像这样的字符串:
“1.68047475E+9”
作为浮点数。
我找到的答案是,在Scala中,当你试图将Numeric Type转换为String时,默认的行为是使用科学记数法来保持精度。如果你发现你不希望你的数字被这样表示,你需要在将它转换为字符串之前将它转换为更精确的数据类型。
举个例子
将返回
1680475334
(System.currentTimeMillis()/1000).toFloat.toString
将返回
1.68047539E+9