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

Output Scala Double to create string compatible with Python

当我在 Python 中使用双精度数进行计算时,格式化这些双精度数的输出返回的字符串如下所示:

>>> 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 相同 precision/rounding/whatever 的双精度小数,这样我就可以从 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 为您提供了最小的十进制表示形式,可以转换回与您开始时相同的 double。 Python 为您提供由 double 表示的精确有理数的小数位数。这两个定义通常在第 17 位有效数字之后完全不同。事实上,第一个从不使用超过 17 个有效数字,而第二个可以有大约 750 个。

为了在Java中获得与Python打印相同的十进制数字字符串,首先将double转换为BigDecimal(此操作是无损的)然后打印 BigDecimal 号码。