[小技巧]你真的了解C#中的Math.Round麼?

2021-01-14 dotNET跨平臺

今天在某.NET Core 群中看到有人在問Math.Round的問題。其實這個問題之前有很多人遇到了,在此總結一下。

開發者為了實現小數點後 2 位的四捨五入,編寫了如下代碼,

var num = Math.Round(12.125, 2);

代碼非常的簡單,開發者實際得到的結果是 12.12, 這與其所預期的四捨五入結果 12.13 相悖。

其實產生這個結果的原因是由於Math.Round 默認使用的並非是四捨五入的原則,而是四捨六入五成雙的原則。

四捨六入五成雙

所謂的四捨六入五成雙,就是說當確定有效位數之後,有效位數的下一位如果小於等於 4 就捨去,如果大於等於 6 就進一,當有效位數的下一位是 5 的時候

從統計學上講,四捨六入五成雙比四捨五入要更精確,因為大量計算的情況下,四捨五入逢五進一,會導致結果偏向大數。

例如:

1.15+1.25+1.35+1.45 = 5.2

如果有效位數是小數點後一位,使用四捨五入原則得到的結果

1.2 + 1.3 + 1.4 + 1.5 = 5.4

而使用四捨六入五成雙原則得到的結果是

1.2 + 1.2 + 1.4 + 1.4 = 5.2

由此可見四捨六入五成雙原則得到的結果更為精確。

Math.Round 的四捨五入

那麼如何使用Math.Round實現預期的四捨五入呢?

其實 C#中的Math.Round提供了非常多的重載方法,其中有兩個重載方法是,

public static double Round (double value,
int digits,
MidpointRounding mode);
public static decimal Round (decimal d,
int decimals,
MidpointRounding mode);

這兩個方法都提供了第三個參數mode, mode是一個MidpointRounding的枚舉變量,它有 2 個可選值

所以如果我們希望得到一個理想中四捨五入的結果,我們可以改用如下代碼:

var num = Math.Round(12.125, 2,
MidpointRounding.AwayFromZero);


相關焦點

  • 尷尬:ES 規範對於 Math.round 的定義,根本實現不了規範
    (好拗口)在 ES5 規範中(15.8.2.15) 對於 Math.round(x) 的定義:... If x is greater than 0 but less than 0.5, the result is +0. ...如果 x 大於 0 但是小於 0.5,那麼結果是 +0。
  • Python內置模塊math介紹
    # 導入模塊import math#dir(module):可以通過它查看任何模塊中所包含的工具
  • 學會 Math 對象這 10 個方法,能讓你事半功倍!
    簡介JavaScript中的math 對讓我們能夠對執行一些數學操作
  • 學會Math 對象這 10 個方法,能讓你事半功倍!
    簡介JavaScript中的math 對讓我們能夠對執行一些數學操作。它具有數學常數和函數的屬性和方法。在今天的文章中將介紹 Math對象的一些有用方法。
  • math-engine v2.0,數學表達式解析計算引擎
    更新日誌: 增加 常量 pi 增加 三角函數支持 sin(), cos(), tan(), cot(), sec(), csc() 增加 三角函數參數調整,可選 弧度RadianMode、角度AngleMode 增加 輔助函數 abs(), ceil(), floor(), round
  • Java面試題|Math.round(-1.5) 等於多少?
    參考答案:運行結果:-1JDK 中的 java.lang.Math 類round() :返回四捨五入,負 .5 小數返回較大整數,如 -1.5 返回 -1。ceil() :返回小數所在兩整數間的較大值,如 -1.5 返回 -1。
  • Python中數據類型,你知道多少
    print(10 + '20')在Python中,有如下基本的數據類型:位,超過17位就用科學計數法表示num01=0.000000000000000000123num02=1000000000000000000000.123print(num01)print(num02)# 輸出結果為:1.23e-191e+21浮點數常見的操作方法:# 保留小數的位數(四捨五入) --round
  • JavaScript用Math.round方法將一個數四捨五入到整數
    基本概念 Math.round()方法用於將它的參數四捨五入到最接近的整數,如果最接近的整數有兩個(此時參數的小數部分為0.5),那麼結果就是更接近正無窮的那一個(或者說數值較大的那一個);如果它的參數原本就是整數,那麼結果就是該參數自身。
  • 你真的了解丙綸防水卷材麼?一定有你不知道的
    那麼,你真的了解這種防水卷材麼 丙綸防水卷材介紹 聚乙烯丙綸高分子複合防水卷材主要是以無紡布和聚乙烯為主要原料
  • Java 四捨五入方法Math.round(-1.5)的值是多少?
    public class Test7 { public static void main(String[] args) { long d1 = Math.round(-1.5); long d2 = Math.round(-1.6); long d3 = Math.round(-2.5); long d4 = Math.round(2.5); System.out.println(d1); System.out.println(d2); System.out.println
  • 30段極簡Python代碼:這些小技巧你都Get了麼
    選自towardsdatascience作者:Fatos Morina機器之心編譯參與:思源學 Python 怎樣才最快,當然是實戰各種小項目,只有自己去想與寫,才記得住規則。本文是 30 個極簡任務,初學者可以嘗試著自己實現;本文同樣也是 30 段代碼,Python 開發者也可以看看是不是有沒想到的用法。
  • UVC LED紫外殺菌技術你真的了解麼?
    UVC LED紫外殺菌技術你真的了解麼?關於UVC LED殺菌技術的問題你了解多少? 2020年以來,市場對消毒產品的需求直線上漲,歐司朗光電半導體也因此推出了不少新型的消毒產品,其中UVC紫外消毒產品,憑藉其巨大的應用價值從眾多消毒產品中脫穎而出,強勢崛起。為什麼UVC紫外殺菌這麼受歡迎,它殺菌的原理是什麼?UVC紫外殺菌是否對人體有所損害?
  • 福祉科普|你真的了解你的肌肉狀況麼?
    你真的了解你的肌肉狀況麼?現在,傳統的臨床影像學檢查主要包括CT,X射線和MRI,均可以檢查患者的骨骼狀況[1]。但當我們想了解患者的肌肉狀況時,傳統的臨床影像學檢查普遍表現較差。而且很多時候,一些潛在患者和許多亞健康人員沒有明顯的骨骼變化,他們的主要是由於肌肉勞損導致了骨骼病變。
  • 【科普天地】關於跳蚤,你真的了解麼?
    你知道麼? 一隻雌跳蚤一天的叮咬次數為400次左右。他們每天像打樁機一樣「勤勞」得在愛寵的皮膚上進行著破壞。
  • 外牆防水中的一些小技巧你都了解多少?
    斯格爾防水7月23日訊 外牆防水的作用想必大家應該都不會陌生,這是一種專門防止外部滲漏的結構工程,今天我們就來介紹下關於在外牆防水中的一些小技巧都有哪些?下面就讓小編為你想先介紹下。
  • 用Python實現喇叭天線設計小工具(二)
    理論部分大體就是這樣,當然,有興趣的同志可以認真看一下論文和參考文獻,大部分理論公式均可於Balanis那本「天線聖經」中找到更為詳細的推導(參見原書第13.2章節),此處不再贅述。= 0.5 * math.sqrt( (ae + ce*s**2 + ee*s**4 + ge*s**6) / (1 + be*s**2 + de*s**4 + fe*s**6 + he*s**8)) * \ lam * math.cos(HPE*math.pi/720) / math.tan(HPE*math.pi/720)
  • 網紅蜜袋鼯你了解麼?小編教你科學飼養!
    蜜袋鼯小名「小蜜」,是近幾年火起來的小寵物。最開始火起來是因為從高處滑翔下來的短視頻,也因此讓很多朋友認識了它。也讓很多朋友眼前一亮,這小傢伙太可愛了,於是乎很多朋友盲目的做起了「小蜜」的鏟屎官。下面小編就帶你了解一下如何科學飼養蜜袋鼯吧!
  • 專業解說 | 你真的了解數學麼?
    原來「數學真的無處不在」,且就在我們身邊,原來除了「大數據」外、在美輪美奐的建築中、在好萊塢的大片中…都離不開數學。那麼,即將選擇數學的你,清楚麼?Why Mathematics?專業方向的確認,興趣和熱情是前提。
  • 4個Python初學者必學的Numpy小技巧
    圖源:UnsplashPython初學者除了要掌握基礎知識外,了解一些小技巧、小竅門也是學習路上必不可少的一種催化劑,能幫助你更好的學習。下面小芯就基於實踐整理出了Python初學者應該學習的4個numpy技巧,它們能夠幫助你編寫更簡潔易讀的代碼。在學習numpy技巧之前,請確保已熟悉以下文章中的一些Python內置功能。1. 掩碼數組——選擇數據集是不完善的,它們總是包含缺失或無效記錄的數組,而這些記錄是時常需要忽略的。例如,由於傳感器故障,氣象站的測量值可能包含缺失值。