2015-12-08 75 views
2

当我使用双打在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项目中的代码。将问题标记为已回答。

+0

我会去阅读JVM和Python的双打规范。 – pedrofurla

+0

尝试使用'Float'代替'Double': '阶> “%.25f” .format(1/10F) res16:字符串= 0.1000000014901161200000000 ' 笔记,你将不能够产生_identical_输出在任何情况下,因为你在连续的零后看到的数字基本上是垃圾。 – Dima

+2

@Dima虽然人们将这些数字看作“垃圾”是个人观点,但它们肯定是可重复的。 'double'值'0.1'(最接近1/10的'double'数字)是独一无二的,它的十进制扩展也是唯一的,这正是Python展示的。 Java为这个'do​​uble'显示的东西也是唯一确定的,尽管它采用了不同的算法。 –

回答

2

Java和Scala为您提供了最小的十进制表示形式,可以将其转换回从您开始的相同的double。 Python为您提供了double所代表的确切有理数的十进制数字。这两个定义通常在第17位有效数字之后根本不同。事实上,第一个永远不会使用超过17个显著数字,而第二个可以有大约750

为了获得在Java的十进制数字比Python打印相同的字符串,第一个转换doubleBigDecimal (这个操作是无损的),然后打印那个BigDecimal的数字。

+0

我在找一个java'Decimal'类时遇到了一些麻烦。你可能指的是BigDecimal类吗?我已经做了一些测试,至今没有任何运气。当我把我的'double'转换成'BigDecimal'并打印格式为'%.25f“的格式bigDec'时,我得到一个像'res0:String = 0.1000000000000000000000000'这样的值。 – bnsmith

+0

@bnsmith是的,我的意思是BigDecimal。请注意,为了使该技巧有效,该值在成为BigDecimal之前必须加倍。如果直接从字符串“0.1”创建一个BigDecimal,例如您将得到1/10的BigDecimal,而不是最接近该值的double。 –

+0

@bnsmith这个问题的作者抱怨说,他们看到你想看到的十进制数:http:// stackoverflow。com/questions/12395281/convert-double-to-bigdecimal-and-set-bigdecimal-precision我尝试制作一个简短的演示Scala程序,但ideone.com不合作。 –