输出Scala Double以创建与Python兼容的字符串
在Python中使用double进行计算时,格式化这些double的输出会返回如下字符串:输出Scala Double以创建与Python兼容的字符串,scala,floating-point,precision,Scala,Floating Point,Precision,在Python中使用double进行计算时,格式化这些double的输出会返回如下字符串: >>> v = 1 / 10.0 >>> v 0.1 >>> "%.25f" % v '0.1000000000000000055511151' 但是,当我对Scala执行类似操作时,最后得到零: scala> val v = 1 / 10.0 v: Double = 0.1 scala> "%.25f" format v res0:
>>> v = 1 / 10.0
>>> v
0.1
>>> "%.25f" % v
'0.1000000000000000055511151'
但是,当我对Scala执行类似操作时,最后得到零:
scala> val v = 1 / 10.0
v: Double = 0.1
scala> "%.25f" format v
res0: String = 0.1000000000000000000000000
我想使用Scala以与Python相同的精度/舍入/任意值输出双精度小数,这样我就可以从Scala和Python代码中生成相同的输出。有人知道怎么做吗
谢谢
编辑
我做了一些实验,这个Java程序似乎产生了与Python代码相同的输出:
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
double v1 = 1.0;
double v2 = 10.0;
double v3 = v1 / v2;
BigDecimal bd1 = new BigDecimal(v3);
System.out.println(String.format("%.25f", bd1));
}
}
在Scala中创建了一个类似的程序,但不起作用:
object Main extends App {
val v1: Double = 1.0d
val v2: Double = 10.0d
val v3: Double = v1 / v2
val bd1: BigDecimal = BigDecimal(v3)
println("%.25f" format bd1)
}
对于我这样的人来说,最好的选择可能是在Scala项目中包含一些简单的Java代码,以便格式化。将问题标记为已回答。Java和Scala为您提供了最小的十进制表示法,可将其转换回与您开始时相同的
双精度。Python为您提供了由您拥有的double
表示的精确有理数的十进制数字。这两种定义通常在第17位有效数字之后有根本的不同。事实上,第一个使用的有效数字从不超过17位,而第二个可以有大约750位
为了在Java中获得与Python打印的十进制数字相同的字符串,首先将double
转换为BigDecimal
(此操作是无损的)然后打印那个BigDecimal
数字。我会去读JVM和Python的Double规范。试着用Float
代替Double
:scala>“%.25f”。format(1/10f)res16:String=0.1000000149011611200000000请注意,在任何情况下都不能产生相同的输出,因为你在一系列的零后面看到的数字本质上是垃圾。@Dima虽然人们认为这些数字是“垃圾”是个人观点的问题,但它们肯定是可复制的。double
值0.1
(最接近1/10的double
数字)是唯一的,其十进制扩展也是唯一的,这就是Python所展示的。Java为那个double
显示的内容也是唯一确定的,尽管是由不同的算法决定的。我在查找JavaDecimal
类时遇到了一些困难。您可能指的是BigDecimal
类吗?我已经用它做了一些测试,到目前为止还没有任何运气。当我将我的double
转换为bigdecim
并使用“%.25f”格式bigDec
打印格式时,我得到了一个类似res0:String=0.10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
@bnsmit的值是的,我的意思是bigdecim。请注意,值在成为BigDecimal之前必须是double,这样技巧才能发挥作用。例如,如果直接从字符串“0.1”
创建一个BigDecimal,则得到的是1/10的BigDecimal,而不是最接近该值的双精度。@bnsmith这个问题的作者抱怨说,他们看到的正是你想要看到的小数:我试图制作一个简短的Scala演示程序,但ideone.com不配合。