2015-12-08 70 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不合作。 –