就在今天,測試提一個BUG,是什麼呢?就是在計算商品採購價時,需要保留2位小數,當時是使用【Math.Round(採購價,2)】這種方法進行四捨五入的,但是這樣寫會有問題,至於什麼問題呢,來看看這篇文章就對了! ...
概述:就在今天,測試提一個BUG,是什麼呢?就是在計算商品採購價時,需要保留2位小數,當時是使用【Math.Round(採購價,2)】這種方法進行四捨五入的,但是這樣寫會有問題,至於什麼問題呢,來看看這篇文章就對了!
四捨五入是一種精確度的計數保留法。在取小數近似數的時候,如果尾數的最高位數字是4或者比4小,就把尾數去掉。如果尾數的最高位數是5或者比5大,就把尾數捨去並且在它的前一位進"1",這種取近似數的方法叫做四捨五入法。
一、BUG回顧
我們經常使用四捨五入時,會使用【Math.Round(價格,2)】這種方法進行轉換。而我也不例外,在計算價格時也是使用這個方法,而當遇到類似這樣的數值時【301.505 】,返回的值卻是【301.5】,按照四捨五入的原則,應該返回【301.51】才對是吧。
代碼:
效果:
源碼:
static void Main(string[] args)
{
double price = 320.75 * 0.94;
Console.WriteLine(price);//301.505
Console.WriteLine(Math.Round(price, 2));//301.5
Console.ReadKey();
}
那這是為什麼呢?根據引用ChatGPT回答如下:
在C#中,Math.Round()函數預設使用的是銀行家舍入法(Banker's rounding),即當小數部分為5時,會根據前一位數字的奇偶性來決定舍入方式。因此,1.085經過Math.Round(301.505,2)舍入後的返回值是301.5,而不是301.51.
然後四捨五入也有個國際慣例,叫奇進偶舍 。就是當舍入位前面一位是奇數時就進,為偶數時就舍。但是這種轉換在國內很多企業就行不通了,那如何解決呢?請看下麵方法。
二、解決掉BUG
我們可以這樣寫【Math.Round(價格, 2, MidpointRounding.AwayFromZero)】就可以解決啦。官方是這樣描述的:"當一個數字是其他兩個數字的中間值時,會將其舍入為兩個值中絕對值較小的值"。
代碼:
效果:
源碼:
static void Main(string[] args)
{
double price = 320.75 * 0.94;
Console.WriteLine(price);//301.505
Console.WriteLine(Math.Round(price, 2));//301.5
double res = Math.Round(price, 2, MidpointRounding.AwayFromZero);
Console.WriteLine(res);///301.51
Console.ReadKey();
}
三、封裝方法
為了能快速使用,為此封裝了一個公共方法。
封裝代碼:
/// <summary>
/// Math輔助類
/// </summary>
public static class MathHelper
{
/// <summary>
/// 四捨五入
/// </summary>
/// <param name="value">值</param>
/// <param name="digits">保留的小數位數(預設:2位)</param>
/// <returns></returns>
public static double MathHalfAdjust(double value, int digits = 2)
{
return Math.Round(value, digits, MidpointRounding.AwayFromZero);
}
}
調用實例:
MathHelper.MathHalfAdjust(12.105, 2);//使用
原文鏈接:https://www.cnblogs.com/kimiliucn/p/17622687.html
版權聲明:本文為原創文章,版權歸 [西瓜程式猿] 所有,轉載請註明出處,有任何疑問請私信咨詢。
原文鏈接:https://www.cnblogs.com/kimiliucn/p/17622687.html