1. 程式人生 > >四捨五入VS銀行家舍入 (四捨六入五取偶)

四捨五入VS銀行家舍入 (四捨六入五取偶)

相信細心的程式設計師們早就發現了.net環境下預設舍入演算法的是“四捨六入”的演算法。從小學我們就學過“四捨五入”演算法,但是更加科學的舍入辦法應該是“四捨六入”,也就是今天我們要討論的“銀行家舍入”。

大家可以做一個Demo。

C#環境下

   1:  class Program
   2:      {
   3:          static  void Main(string[] args)
   4:          { 
   5:             do
   6:             {
   7:                  Console.WriteLine("請輸入一個小數回車測試,輸入其他回車結束測試");
   8:                  string Num = Console.ReadLine();
   9:                  try
  10:                  {
  11:                      Console.WriteLine("結果為" + Convert.ToInt16(Convert.ToDouble(Num)));
  12:                  }
  13:                  catch (Exception e) {
  14:                      break;
  15:                  } 
  16:             }
  17:             while (true );
  18:          }
  19:      }

得到的結果如下

image

VB.net環境下測試程式碼為

 Sub Main()
        Do
            Console.WriteLine("請輸入一個小數回車測試,輸入其他回車結束測試。")
            Try
                Dim a As String = Console.ReadLine()
                Console.WriteLine("結果為:" & Math.Round(Convert.ToDouble(a)))
            Catch ex As Exception
                Exit Sub
            End Try
        Loop
    End Sub
結果如下

image

完全符合銀行家舍入的規律:四捨六入五考慮,五後非零就進一,五後為零看奇偶,五前為偶應捨去,五前為奇要進一

提示:五後非零就進一”看上圖示例中的1.51和2.51計算結果

關於VB.net中的CInt微軟的MSDN上有具體說明

Fractional Parts. When you convert a nonintegral value to an integral type, the integer conversion functions (CByte,CInt, CLng, CSByte,CShort,CUInt, CULng, and CUShort) remove the fractional part and round the value to the closest integer.

If the fractional part is exactly 0.5, the integer conversion functions round it to the nearest even integer. For example, 0.5 rounds to 0, and 1.5 and 2.5 both round to 2. This is sometimes calledbanker's rounding, and its purpose is to compensate for a bias that could accumulate when adding many such numbers together.

相對於四捨五入,銀行家舍入的確更加的準確,討論如下:

有些童鞋可能認為在一般性的測量中,最後一位小數位上0至9出現的概率是相等的。一共十個數字,0至4可以捨去(四舍),5至9可以進位(五入),多麼完美的舍入演算法!

但是!您可能忽略了一點,末尾的0在這裡是相當於10還是相當於0?

為了避免混沌,請看下圖:

image

圖中是用Matlab畫的一個簡單的數軸,可以看出0.0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1.0中0.0和1.0都是0結尾所以不能確定測量資料中的0是哪個零!

還是看上圖,圖中只要不滿0.5都按照0算,大於0.5都按照1.0算,那麼剩下的0.5怎麼辦?為了體現平均性,看上一位是奇數還是偶數,如果是奇數則進位,如果是偶數則捨去。這正是“銀行家舍入”的思想。這樣一來便達到了相對於“四捨五入”舍入方法更加平衡的舍入演算法。

PS:“銀行家舍入”是IEEE 規定的舍入標準。因此所有符合IEEE標準的語言都是採用這一演算法的。

相關推薦

四捨五入VS銀行家 ()

相信細心的程式設計師們早就發現了.net環境下預設舍入演算法的是“四捨六入”的演算法。從小學我們就學過“四捨五入”演算法,但是更加科學的舍入辦法應該是“四捨六入”,也就是今天我們要討論的“銀行家舍入”。 大家可以做一個Demo。 C#環境下 1: class Pr

SqlServer2005 成雙 函式

SqlServer2005 用到了四捨六入五成雙,結果網上找了下,沒一個能行的。到處都是複製,轉帖的,亂七八糟。隨花時間寫了一個 僅僅經過了自己少數驗證,所以僅供參考,如發現錯誤請指正,謝謝! --=

VB6-對數值的-四捨五入/留雙-及推廣

裝作自己厲害到能寫部落格了… 真的只是個水貼…做的比我好的不是大有人在了 而是不計其數了 最簡單的 四捨五入到個位: Iris= Int(Lily + 0.5) 推廣到 四捨五入到10^P位: Iris = Int(Lily * 10 ^ (-P) + 0.5)

php 銀行家)實現

專案中要用到銀行家舍入方法,php沒有現成的方法,所以寫了一個 function up6down4($num,$n){ $pow = pow(10,$n); $con_a = floor(round($num * $pow * 10,1)); $

銀行家演算法

Java5以上使用銀行家的舍入法則很簡單。直接使用RoundingMode類提供的Round模式即可 public class Client { public static void main(String[] args) { //存款 BigDecimal d = new Big

【JavaScript】Tofixed(),,修改成四捨五入

tofixed(),四捨六入五湊偶,修改成四捨五入 方法一: 在JS中四捨五入的函式 toFixed(n) , n為要保留的小數位數。 n為0~20,當n超過20的時候,JS會出錯。 如果小數點前和要擷取的前一位都是0時,不會按常理擷取。

C# 四捨五入 (解決成雙的問題)

四捨六入五成雙是一種精確度的計數保留法.舍入規律是"四捨六入五成雙",這裡"四"是小於五的意思,"六"是大於五的意思,"五"是舍入位之後的尾數逢五的話看前一位,奇進偶不進,就像1.25,因為2是偶數,所以是1.2。又像1.35,因為3是奇數,所以是1.4,明不明白,這個是資料

php成雙演算法

四捨六入五成雙演算法,本文是用php實現 1.四捨六入五成雙是什麼?首先看一下百度百科怎麼定義的: 2.php封裝方法 public function calculate($num,$precision){ $pow = pow(10,$precision

【測繪專用】成雙的C++實現

作為一名測繪專業的學生,在內業計算中經常遇到遇到小數點後保留幾位小數的問題。根據《工程測量實驗教程》(王宇會 著)一書,內業計算按“四捨六入,五前單進雙舍(或稱奇進偶不進)”的取捨規則進行尾數的取捨。如資料1.1235和1.1245小數點後保留三位時,均應為1.124 //四捨六入五成雙的基於

Math.Round成雙和double.tostring()的用法

在C#中大家都會遇到這種情況 double型別的資料,需要格式化(保留N未有效數字)或者是保留N為小數等情況,我們往往採取double.tostring("引數");的方法。下面就列出幾個常用的方法。 double temp=3.1415926; (F)Fixed point:string str1=

在Excel中自定義函式Round46()

'================================ ' 四捨六入函式 ' ' 演算法:四合六入五考慮,五後非零就進一,五後皆零看奇偶,五前為偶應捨去,五前為奇要進一。 ' 作者:崔軍明 ' 編寫:2011-1-14 ' 修改:2011-1-15 '=======================

成雙的浮點轉整型的巨集定義

原來浮點轉整型,如果用C或是C++強制轉換的話,小數部分就全部都捨去了。 如:float temp=2.55; (int)temp=2 如果想四捨五入呢?注意,這裡的四捨五入不是傳統的四捨五入,因為四捨五入的誤差很大,正確的方法為:四捨六入五成雙,如果小數為:5,則根據前面

JS toFixed 成雙

以前一直以為toFixed就是四捨五入的方法,後來又有一段時間以為toFixed是五舍六入。今天終於寫的時候,終於才知道toFixed是一個叫做四捨六入無成雙的詭異的方法。。。 完全不明白為什麼要這麼寫。。。 什麼是四捨六入五成雙:百度是這麼說的: 對於位數很多的近似數

在Excel中用函式實現數字“

“四捨六入五湊偶”取整 =IF((A1*10-INT(A1)*10)<=4,INT(A1),IF((A1*10-INT(A1)*10)>=6,INT(A1)+1,INT((INT(A1)+1)/2)*2)) “四捨六入五湊偶”保留一位小數 =IF((A1*100-

C語言與c++標準輸出底層細節-成雙

引言:相信每個學生從小學就被教導要四捨五入,那四捨五入真的通用嗎? 四捨六入五成雙: 1."四捨六入五成雙"是什麼?     這是一種數字修約規則,一種比四捨五入更加精確科學的計數保留法.     其實就是在進位時四舍六進,為五時若後面有有效數字則捨去進1,否則前

JAVA

規則:四捨六入五考慮,五後非零就進一,五後皆零看奇偶,五前為偶應捨去,五前為奇要進一。為了避免四捨五入規則造成的結果偏高,誤差偏大的現象出現,一般採用四捨六入五留雙規則。 // 1.當尾數小於或等於4時,直接將尾數捨去 System.out.pr

四捨五入銀行家

四捨五入是一種應用非常廣泛的近似計算方法,其有算術舍入法和銀行家舍入法兩種。 所謂算術舍入法,就是我們通常意義上的四捨五入法。其規則是:當捨去位的數值大於等於5時,在捨去該位的同時向前位進一;當捨去位的數值小於5時,則直接捨去該位。 銀行家舍入法即“四捨六入法”,可

銀行家VS四捨五入

using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication2{class Program {static void Main(string[] args) { Console.Wri

末尾 導致 奇數 style 四舍五入 -s 進位 偶數 span 被修約的數字等於5時且5的後面沒有不為“0”的任何數,要看5前面的數字。 若是奇數則進位,若是偶數則將5舍掉,即修約後末尾數字都成為偶數; 若5的後面還有不為“0”的任何數,則此時無論5的前面是奇數還是

Python3基礎 str format 保留一位小數

ati 書寫 credit py3 ive orm ogl doc 設計 ? python : 3.7.0 OS : Ubuntu 18.04.1 LTS