the 1st edition: 20210415
the 2nd edition: 20260113
對「
Re: [討論] 請大家聊聊 JavaScript的缺陷」這問題很好奇, c++ 也有類似的情形。
這邊可以測試 js:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_tofixed
藉由 ai, ref 4, 終於知道是怎麼回事, 當決定要印出小數點 2 位數時候用的演算法是「偶數捨入法」(Banker's Rounding) 這是很多繪圖、統計或會計系統的規則: 若剛好在 .5 的位置, 則捨入到最接近的「偶數」。
0.005 → 靠近 0.00 還是 0.01? 這裡 0 是偶數, 所以會趨向 0.00, 但在電腦裡 0.005 是 0.00500000000000000010 所以它判斷靠近 0.01。
0.015 → 靠近 0.01 還是 0.02? 這裡 2 是偶數, 本應往 0.02 走, 但在電腦裡 0.015 是 0.0149..., 所以它決定留在 0.01。
另外也請 ai 給出一個簡易版本的演算法, 實作 Banker's Rounding。
另外注意 fn.cpp L19, 需要用 long double, 如果用 double 結果會是 0.015 印出來會是 0.02, 因為演算法 L23 value * multiplier 0.014999999999999999 X 100 變成是 1.50000000000000000000, 而不是 1.4999, 需要使用精度更高的 long double 才會是 1.4999。
ref:
-
C++中cout用fixed以及setprecision 設置輸出精度時候,為什么不是四舍五入
-
What is the rule behind toFixed() function
-
Algorithm Number.prototype.toFixed (fractionDigits)
- 問 gemini 過程
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。