none
常理的(而不是IEEE)的四捨五入 RRS feed

  • 問題

  • 各位好,

    開發工具是 VB2008, 想請教:
    如何讓 1559.30249 四捨五入成 1559.303 ?

    問題看起來很簡單呵, 試過:
    Round(1559.30249,3) = 1559.302
    Round(1559.30249,3,MidpointRounding.AwayFromZero) = 1559.302
    String.Format("{0:0.000}",1559.30249) = "1559.302"
    1559.30249.ToString("0.000") = "1559.302"
    1559.30249.ToString("0.###") = "1559.302"
    都不是 1559.303...

    目前是有另外的方法可達成目的, 但想請教各位前輩是否有較好的方法,

    謝謝!

     

    2010年8月19日 上午 07:45

解答

所有回覆

  • 我覺得你的邏輯是特殊的;四捨五入看你要取到幾個位數,他會去判斷下一個位數的值是多少,而去做進位處理,但也不是一直往前進位,不然這樣誤差值太大了。


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    • 已提議為解答 Johnny.Net 2010年8月19日 上午 08:22
    2010年8月19日 上午 08:18
    版主
  • 下面這篇可以參考看看

    http://www.blueshop.com.tw/board/show.asp?subcde=BRD20040702155510LLZ&fumcde=FUM20050124191756KKC

    其中加上0.5的方式也可以考慮看看是不是合用。


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    • 已標示為解答 Ader.Chen 2010年8月19日 上午 10:29
    2010年8月19日 上午 08:24
    版主
  • 依照「常理」1559.30249 「四捨五入」後就是 1559.302; 是「強制進位」才會變成 1559.303。

    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny

    ★請提問人注意: 我的回覆都只是基於我的雞婆與個人興趣; 為了不要因為我的雞婆與個人興趣引起別人的誤會, 敬請提問人*切勿*(就是「絕對不要」的意思)將我的任何回覆標示為解答。如果你一定要標, 麻煩往我樓上任選一個去標就行了。

    2010年8月19日 上午 08:25
  • 謝謝各位熱心回應,

    原情況是我在將一個以前VB6寫的程式, 改用 VB2008 重寫,
    使用者反應怎麼兩程式運算後的結果不同: VB6 正確 1559.303, VB2008 卻算成 1559.302.
    當場被K怎麼這麼簡單的四捨五入也會算錯...

    最後採用如 bauann 前輩建議, 改成 Round(oBwCent + 0.00005, 3) 方式.
    謝謝!

    2010年8月19日 上午 10:29
  • VB6 跟 VBNET 都是用 Double ,且邏輯一致時,答案會是相同的。

    VB6 跟 VBNET 差異在整數的位元組數不同,所以有可能是你的 VB6 運算中經過 2 bytes Integer 的精度較差,而 VBNET 的 4 bytes Integer 精度較高,計算結果才會不一樣。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Ader.Chen 2010年8月20日 上午 04:18
    2010年8月19日 下午 01:49
  • 主因確如 心冷熱情熄 前輩所說的.

    花了一上午對照新舊程式近數千行程式碼, 將資料型別全改為一致後, 果然讓數百筆被新程式判為 NG 的產品資料重新復活.
    (當初是覺得資料精度以 single 取代 double 就足夠且節省記憶體說, 沒想到會因此讓數百顆已入庫的產品因 0.001 誤差而無法出貨...)

    謝謝各位前輩指點.

    2010年8月20日 上午 04:39