當我使用雙打在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'顯示的東西也是唯一確定的,儘管它採用了不同的算法。 –