首页 > 编程语言 >C#中的浮点型传统舍入和银行家舍入

C#中的浮点型传统舍入和银行家舍入

时间:2025-01-08 09:33:14浏览次数:1  
标签:舍入 四舍五入 MidpointRounding C# 浮点 num AwayFromZero 银行家

C#的小数舍入提供了五种规则,常用的就是AwayFromZero和Toeven,这里主要介绍这两个枚举值,其他三个了解一下一般规则有印象就好,用的不多。

MidpointRounding枚举值

image

MidpointRounding枚举值相关含义:

枚举值 恰好在中间时的处理 一般规则
ToEven 向最近的偶数舍入 银行家舍入法
AwayFromZero 向远离零方向舍入 更接近绝对值更大的整数(传统舍入)
ToZero 向零方向截断 去掉小数部分
ToNegativeInfinity 向负无穷舍入 总是小于或等于原始值
ToPositiveInfinity 向正无穷舍入 总是大于或等于原始值

具体差异:

  • 传统舍入(MidpointRounding.AwayFromZero):无论是正数还是负数,遇到 .5 时,都会将结果舍入到更大的数字。例如,2.5 会四舍五入为 3,-2.5 会四舍五入为 -3。

  • 银行家舍入(MidpointRounding.ToEven):当遇到 .5 时,结果会舍入到最接近的偶数。例如,2.5 会四舍五入为 2(最接近的偶数),而 3.5 会四舍五入为 4(最接近的偶数)。

测试代码如下:

using System;
using System.Diagnostics;
using System.IO;

class Program
{
    static void Main()
    {


        // 一些测试数字,保留三位小数
        double[] numbers = {
            1.2354, 
            1.2454, 
            1.2515, 
            1.2625, 
            1.2765,
            1.2875,
            1.2886,
            1.2896};

        Console.WriteLine("传统舍入(AwayFromZero):");
        foreach (var num in numbers)
        {
            Console.WriteLine($"{num} => {Math.Round(num, 3, MidpointRounding.AwayFromZero)}");
        }

        Console.WriteLine("\n银行家舍入(ToEven):");
        foreach (var num in numbers)
        {
            Console.WriteLine($"{num} => {Math.Round(num, 3, MidpointRounding.ToEven)}");
        } 

        Console.ReadKey();
    }
}

结果如下:

image

对比两个方法的差异就是银行家四舍五入会在第四位小数是5,看第三位是奇数还是偶数,如果是奇数则入到下一个偶数,如果是偶数则不变。

注意:

在C#中,Math.Round(double value, int digits)函数默认使用的是银行家四舍五入,这个时候如果用C#的四舍五入的方法和Windows的计算器计算出来的结果会不一样,类似于1.2625这个保留三位小数C#默认采用银行家四舍五入等于1.262,然而计算机采用传统四舍五入等于1.263。开发使用银行家四舍五入,测试使用传统四舍五入,这个时候就会出现"Bug",为了统一使用传统四舍五入,可以使用函数Math.Round(1.2625, 3, MidpointRounding.AwayFromZero);,参数mode赋值MidpointRounding.AwayFromZero

标签:舍入,四舍五入,MidpointRounding,C#,浮点,num,AwayFromZero,银行家
From: https://www.cnblogs.com/dx5800/p/18595793

相关文章

  • .Net轻量级的CMS开源项目
    推荐一个Star超过2K的.Net轻量级的CMS开源项目 推荐一个具有模块化和可扩展的架构的CMS开源项目。01项目简介PiranhaCMS是一个轻量级且跨平台的CMS库,专为.NET8设计。该项目提供多种模板,具备CMS基本功能,也有空模板方便从头开始构建新网站,甚至可以作为移动应用的后端。......
  • VideoDecoder.seek
    PromiseVideoDecoder.seek(numberposition)基础库2.11.0开始支持,低版本需做兼容处理。小程序插件:支持功能描述跳到某个时间点解码参数numberposition跳转的解码位置,单位ms返回值Promise基础库2.16.1开始支持,低版本需做兼容处理。......
  • C#中的浮点型传统舍入和银行家舍入
    C#的小数舍入提供了五种规则,常用的就是AwayFromZero和Toeven,这里主要介绍这两个枚举值,其他三个了解一下一般规则有印象就好,用的不多。MidpointRounding枚举值MidpointRounding枚举值相关含义:枚举值恰好在中间时的处理一般规则ToEven向最近的偶数舍入银行家舍入法AwayFro......
  • 启航数据结构算法之绮旅,漫步C++智慧之道——LeetCode题海探幽:轮转数组之多元策略演绎
    人无完人,持之以恒,方能见真我!!!共同进步!!文章目录复杂度练习之轮转数组方法1方法2方法3总结复杂度练习之轮转数组题目链接:轮转数组为什么我们把这道题作为复杂度的练习题呢?是因为我们以后做题都会涉及到复杂度的计算,我们要保证我们写的程序不会超出题目的时间......
  • 详解SonnarQube 集成Sonar-dependency-check-plugin​​​​​​​落地应用的方案以及
    Dependency-Check Dependency-Check用来检查代码中是否存在任何已知的,公开披露的安全漏洞。他检查依赖项中是否存在漏洞的原理也跟我们熟知的病毒查杀软件一样,预先定义好目前已知的安全漏洞库,检查依赖包时,发现这些漏洞就会报错,最后定期更新安全漏洞库即可!更多信息可以参考文......
  • 如何应对DedeCMS网站被非法篡改?(DedeCMS网站安全防护与恢复指南)
    当DedeCMS网站遭受黑客攻击或恶意篡改时,不仅会影响用户体验,还可能带来严重的安全隐患。本文将探讨如何快速识别并修复这些问题,同时提供预防措施以避免未来再次发生类似事件。答案:面对DedeCMS网站被非法篡改的情况,建议采取以下步骤来应对和预防:立即断开服务器连接:一旦发现网站......
  • MediaRecorder.on
    MediaRecorder.on(stringeventName,functioncallback)基础库2.11.0开始支持,低版本需做兼容处理。小程序插件:支持功能描述注册监听录制事件的回调函数。当对应事件触发时,回调函数会被执行。参数stringeventName事件名eventName的合法值值说明最低版本......
  • MediaRecorder
    MediaRecorder基础库2.11.0开始支持,低版本需做兼容处理。可通过wx.createMediaRecorder创建。MediaRecorderWebGL画面录制器,可以进行录制相关操作,在结束录制时导出视频文件方法PromiseMediaRecorder.pause()暂停录制PromiseMediaRecorder.resume()恢复录制Prom......
  • wx.createMediaRecorder
    MediaRecorderwx.createMediaRecorder(Objectcanvas,Objectoptions)基础库2.11.0开始支持,低版本需做兼容处理。小程序插件:支持,需要小程序基础库版本不低于2.11.0功能描述创建WebGL画面录制器,可逐帧录制在WebGL上渲染的画面并导出视频文件参数ObjectcanvasW......
  • wx.exitVoIPChat
    wx.exitVoIPChat(Objectobject)基础库2.7.0开始支持,低版本需做兼容处理。以Promise风格调用:支持小程序插件:支持,需要小程序基础库版本不低于2.9.0微信Windows版:支持微信Mac版:支持相关文档:多人音视频对话功能描述退出(销毁)实时语音通话参数Objectobjec......