據我所知,著名IEEE 754:Java腳本對C
(0.1 + 0.2) !== 0.3
疑難雜症實際上不是JavaScript的錯。這就是IEEE 754的工作方式。 Python中也有類似的輸出,它也遵循IEEE 754規則。
那麼這個特定的例子如何在C中預期的工作,有時。如果我做一個直接的比較
printf("%d\n", (0.1+0.2) == 0.3);
我得到的(未?)預期產出0
,但如果我把值變量或者打印出來,我得到適當的四捨五入的答案。
是C實現的IEEE 754的做一些額外的東西?或者是我缺少的其他東西。
更新
我張貼的代碼示例是由於一個錯字打破。嘗試這一個 Fixed C Runnable Example
但原來的問題仍然存在。
double d1, d2, d3;
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));
printf ("%.17f\n", d1+d2);
printf ("%d\n", ((d1+d2) == d3));
輸出是
1
0.30000000000000004
1
的改寫現在的問題是:
爲何(以及何時,以及如何)是C編譯器採取自由地說,
0.3 == 0.30000000000000004
考慮到所有的事實,是不是真的C實現被破壞,而不是Javascript的?
您的代碼示例中,你從來沒有真正打印任何不是整數的數字。 – Alnitak
你的問題與JavaScript沒有任何關係。它必須處理C和處理雙打,有時你會得到一個結果,而其他時候你會得到不同的結果。 (我的猜測是,有時,預處理器做數學,還等什麼的*編譯*看到的是'的printf(「%d \ n」,0.3 == 0.3);',但它只是一個猜測) –
@Manav:即使你也提供了一個鏈接,總是在問題本身中包含相關的代碼(和輸出)**。您目前在問題中的代碼與您鏈接的代碼有*不同,鏈接可能會失效。更多:http://meta.stackexchange.com/questions/118392/add-stack-overfow-faq-entry-or-similar-for-putting-code-in-the-question –