当我使用双打在Python计算,格式化那些双打的输出还给看起来像这样的字符串:输出斯卡拉双创建兼容的字符串与Python
>>> v = 1/10.0
>>> v
0.1
>>> "%.25f" % v
'0.1000000000000000055511151'
然而,当我做类似的东西斯卡拉,我在最后得到零:
scala> val v = 1/10.0
v: Double = 0.1
scala> "%.25f" format v
res0: String = 0.1000000000000000000000000
我想用Scala的输出双精度小数与具有相同精度/四舍五入/不管是Python的,这样我就可以产生来自斯卡拉相同的输出和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中的一个类似的计划,但它不” t工作:
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)
}
也许在我的情况下,某人的最佳选择将包括一些简 - 简Jav用于格式化的Scala项目中的代码。将问题标记为已回答。
我会去阅读JVM和Python的双打规范。 – pedrofurla
尝试使用'Float'代替'Double': '阶> “%.25f” .format(1/10F) res16:字符串= 0.1000000014901161200000000 ' 笔记,你将不能够产生_identical_输出在任何情况下,因为你在连续的零后看到的数字基本上是垃圾。 – Dima
@Dima虽然人们将这些数字看作“垃圾”是个人观点,但它们肯定是可重复的。 'double'值'0.1'(最接近1/10的'double'数字)是独一无二的,它的十进制扩展也是唯一的,这正是Python展示的。 Java为这个'double'显示的东西也是唯一确定的,尽管它采用了不同的算法。 –