




























四舍五入是一种精确度的计数保留法。在取小数近似数的时候,如果尾数的最高位数字是4或者比4小,就把尾数去掉。如果尾数的最高位数是5或者比5大,就把尾数舍去并且在它的前一位进"1",这种取近似数的方法叫做四舍五入法。
我们经常使用四舍五入时,会使用【Math.Round(价格,2)】这种方法进行转换。而我也不例外,在计算价格时也是使用这个方法,而当遇到类似这样的数值时【301.505 】,返回的值却是【301.5】,按照四舍五入的原则,应该返回【301.51】才对是吧。
代码:
效果:
源码:
static void Main(string[] args)
{
double price = 320.75 * 0.94;
Console.WriteLine(price);
那这是为什么呢?根据引用ChatGPT回答如下:
在C#中,Math.Round()函数默认使用的是银行家舍入法(Banker's rounding),即当小数部分为5时,会根据前一位数字的奇偶性来决定舍入方式。因此,1.085经过Math.Round(301.505,2)舍入后的返回值是301.5,而不是301.51.
**按照【银行家舍入法(Banker's rounding)】规则如下:**
1、当舍去位的数值小于5时。直接舍去。
2、当舍去位的数值大于6时,进位加1。
3、当舍去位的数值等于5时,分两种情况:
(1)若5后面有其他非0数字(即5不是最后一位)时,进位加1
(2)若5后面只有0(即5是最后一位)时,则根据5的前一位的奇偶来判断,前一位为奇数则进位加1,为偶数则舍去。
遇到5需要舍去的情况只有一种,即5是最后一位有效数且前一位数是偶数。
但是这种转换在国内很多企业就行不通了,那如何解决呢?请看下面方法。
我们可以这样写【Math.Round(价格, 2, MidpointRounding.AwayFromZero)】就可以解决啦。官方是这样描述的:"当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值"。
代码:
效果:
源码:
static void Main(string[] args)
{
double price = 320.75 * 0.94;
Console.WriteLine(price);
封装代码:
/// <summary>
/// Math辅助类
C# 复制 全屏
调用实例:
MathHelper.MathHalfAdjust(12.105, 2);//使用
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。