Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
输出Scala Double以创建与Python兼容的字符串_Scala_Floating Point_Precision - Fatal编程技术网

输出Scala Double以创建与Python兼容的字符串

输出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:

在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: 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
显示的内容也是唯一确定的,尽管是由不同的算法决定的。我在查找Java
Decimal
类时遇到了一些困难。您可能指的是
BigDecimal
类吗?我已经用它做了一些测试,到目前为止还没有任何运气。当我将我的
double
转换为
bigdecim
并使用
“%.25f”格式bigDec
打印格式时,我得到了一个类似
res0:String=0.10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
@bnsmit的值是的,我的意思是bigdecim。请注意,值在成为BigDecimal之前必须是double,这样技巧才能发挥作用。例如,如果直接从字符串
“0.1”
创建一个BigDecimal,则得到的是1/10的BigDecimal,而不是最接近该值的双精度。@bnsmith这个问题的作者抱怨说,他们看到的正是你想要看到的小数:我试图制作一个简短的Scala演示程序,但ideone.com不配合。