the 1st edition: 20210415
the 2nd edition: 20260113
對「
Re: [討論] 請大家聊聊 JavaScript的缺陷」這問題很好奇, c++ 也有類似的情形。
這邊可以測試 js:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_tofixed
也可以直接在瀏覽器上開啟 fn1.html 測試。
一開始查了 ref 1,2,3 的資料, 都沒什麼幫助, 藉由 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 給出一個簡易版本的演算法, 可以印出這樣的結果, 當然也不是一次到位, 發現一些問題, 修正了幾次才成功, 浮點數水太深。
另外注意 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。
oopFoo 補充了一些資訊:
Re: [討論] 請大家聊聊 JavaScript的缺陷
ref:
-
C++中cout用fixed以及setprecision 設置輸出精度時候,為什么不是四舍五入
-
What is the rule behind toFixed() function
-
Algorithm Number.prototype.toFixed (fractionDigits)
- 問 gemini 過程
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。