【工作笔记0036】C#中Decimal小数取整容易犯错的坑

news2025/5/14 17:49:59

这两天排查一个bug,数据库中同样的计算公式 和 C#代码中一毛一样的计算公式,最后结果为 Decimal 类型的小数,需求保留两位小数。但是结果是数据库中 和 代码中的结果总是对不上。

整理并简化了一下项目中代码计算公式:

decimal a = 3, b = 0, c = 0.035;

var s = Math.Round((a - b) * c, 2);

问题来了,项目数据库用的sqlserver,上面同样公式,数据库算出来是 0.11,而C# 代码中算出来是 0.10。

如果不保留小数,原始结果都知道是 0.105,那么为什么四舍五入后,结果为啥却不一样呢??

一开始,我也没有想明白,盯着代码愣了半天,就好像自己的考试一样,明明觉得得了100分,为啥最后还是99。

后来上了个厕所回来,抛开所有疑问,看看是不是这个 取整函数的问题。于是,发现 Math.Round 有很多个重载函数,于是 F12 进去看了看,发现有个参数 MidpointRounding 的枚举值,再 F12 进去看,发现有两个东西 ToEven、AwayFromZero。嗯?!。。应该是这里的问题,继续探索!

查了一些资料,微软官方对这两个枚举值的解释如下:

https://learn.microsoft.com/zh-cn/dotnet/api/system.midpointrounding?redirectedfrom=MSDN&view=net-7.0

公司项目比较老,上述截图是 C# 7.0 里面的,其中还多了几个枚举值,这里不说明,有兴趣自己百度吧!我就说跟我遇到问题最相关的这个枚举值 AwayFromZero

提到 AwayFromZero 这个,还需要首先了解一下“四舍五入”的理解:

(1)中国人的理解:1~4就舍去,5~9就进1

(2)外国人的理解:按照IEEE的标准,默认是 1~5就舍去,6~9就进1

好吧,问题就出现在我们理解的“四舍五入”的最中间的 5。AwayFromZero 的参数就是告知代码逻辑,遇到 5 的时候,进1处理。

回到问题本身,说明项目中的数据库是将 5 进1 了,那么代码中也改为 5进1的规则即可。于是将上述代码修改为这样,就解决了问题:

var s = Math.Round((a - b) * c, 2, MidpointRounding.AwayFromZero); // 结果为 0.11

反思,即便是一个自认为很小的问题,有可能会让你的见识焕然一新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vitest第一章(初始vitest)

从三个角度分析vitest 他能做什么? 为什么要使用他? 使用它的优势是什么? vitest官网cn.vitest.dev/ 1.vitest能做什么 从官网介绍说这是一个单元测试框架,大家听到有测试两个字觉得这个是测试同学写的东西,其实这个…

低版本浏览器(webview)空数据音频文件异常报错

问题背景 监控出现大量静态资源加载异常报警,ios和安卓各系统版本都有(排查了一段时间,发现是QA同学在全量测试,无语凝噎)QA测试反馈,报告页在收音失败的情况稳定复现播放音频失败(确实有问题&…

Qos实验配置-CBQ方式

目录 对报文进行重标记 对数据报文进行流量监管-接口入方向 将报文加入相应队列 为语音业务配置丢弃策略 配置流量整形-接口出方向 QoS理论讲解_静下心来敲木鱼的博客-CSDN博客_qos 优先级映射https://blog.csdn.net/m0_49864110/article/details/127414766?ops_request_…

MATLAB 绘制数据图

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

python中的socket套接字基础 (客户端服务器信息交互)

文章目录1 socket概述2 socket使用2.1 socket常用函数2.2 简单实现 客户端与服务器 信息交互2.3 多线程实现服务器和客户端信息交互1 socket概述 Python中,我们利用Socket套接字来实现网络通信,可以说套接字是实现网络编程进行数据传输的一种技术手段。S…

UNIX环境高级编程_文件IO_共享文件操作

这篇笔记记录下,多进程(包括父子进程)操作同一个文件,或者同一个文件被同一个进程多次打开时的情况,总是傻傻分不清,必须记录一下了。 1 文件IO_共享文件 分下面四种情况记录。 情况1:同一进程多次open同一个文件 …

SAP MESSAGE :000 消息提示「BUG」

SAP MESSAGE :000 消息提示 错误消息 问题分析 前言&#xff1a;这个问题 DEBUG 模式没有抓到&#xff0c;所以才有了下文&#xff1a; 这是迁移程序时会出现的问题&#xff0c;参见下面的图片&#xff1a; 在迁移前&#xff0c;MATNR 转码 FUNC 就没有规范书写 sy-subrc <…

第十三章 常用类(包装类和String 相关类)

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据的转换 &#xff08;1&#xff09;jdk5 前的手动装箱和拆箱方式 public cl…

好友靠JVM成功进入阿里,阿里P8力荐的JVM笔记到底有什么魔力?

大家都是有经验的Java开发人员&#xff0c;想想为何要学习JVM? [面试?调优?装逼? ] 不管出于何种原因&#xff0c;总之你得先学好。那怎么学好呢? 每个人对于JVM的了解可能不一样&#xff0c;这就要考虑到怎么切入 既然大家都学习过Java&#xff0c;那不妨就从Java开始…

数据分析思维(四)|分类/矩阵思维

分类与矩阵思维 1、概念 在进行数据分析工作时&#xff0c;我们往往会涉及到多个核心指标&#xff0c;而对于不同数值核心指标的结合又会产生多种不同的结果&#xff0c;我们将相似结果的内容放到一起进行统一决策就会大大节省数据分析的时间&#xff0c;这种思想我们称之为分…

[python入门㊲] - python的继承

目录 ❤ 什么是继承 ❤ 派生和继承 ❤ 单继承 ❤ 多继承 ❤ MRO[方法搜索顺序](多继承顺序) ❤ 新式类和旧式&#xff08;经典&#xff09;类 ❤ 什么是继承 通过继承基类来得到基类的功能 所以我们把被继承的类称作父类或基类&#xff0c;继承者被称作子类 可…

注册外贸公司需要注意的问题

关于注册海外公司需要注意事项&#xff0c;米贸搜以美国为例&#xff0c;整理以下信息&#xff0c;希望可以帮助到你一、注册美国公司注意事项&#xff1a;1、拟定要注册的美国公司名称三个&#xff08;英文&#xff09;&#xff0c;核名如无重复则可使用&#xff1b;2、美国公…

matlab机电耦合系统相位分岔图

1、内容简介略638-可以交流、咨询、答疑2、内容说明略3、仿真分析clcclose allclear%% parameterglobal CC 48;tspan [0 5]; % 仿真时间x0 [0.1 0.1 0.1 0.1]; % 变量初始值[T,X] ode45(model_diff, tspan, x0); % 调用求解器X3_dot [0;diff(X(:,3))./diff(T)]; % 求解x3的…

【已解决】SpringCloudConfig客户端启动无法读取到配置参数

自己部署了一个Spring Cloud微服务项目&#xff0c;实践Spring Cloud Config分布式配置组件&#xff0c;按照Spring Cloud Config 资料Config&#xff1a;Spring Cloud分布式配置组件 先后创建了Eureka注册中心服务、 Spring Cloud Config Server服务、 Spring Cloud Config Cl…

极客星球 | Elasticsearch入门与实战技术分享

为持续夯实MobTech袤博科技的数智技术创新能力和技术布道能力&#xff0c;本期极客星球邀请了MobTech企业服务研发部工程师勤佳&#xff0c;从Elasticsearch集群安装、DSL语句讲解、深度分页、IK分词器、滚动索引等方面进行了阐述和分享。 一、集群环境安装 elasticsearch 是…

节后转岗“浪潮”来了!瞅准“趋势向上”的行业!

“跨行跨岗人员&#xff0c;怎么能顺利转行&#xff1f;”的话题一直存在&#xff01;成功人士给出一条转岗转行的原则&#xff1a;迁移到技能相近但趋势向上的岗位。那么&#xff0c;什么叫“技能相近”和“趋势向上”呢&#xff1f;让我们来看看。趋势向上除了技能相近&#…

现阶段元宇宙经常偏离原有的发展轨道,使其失去该有的功能和意义

人们总是会自然地陷入到约定俗成的俗套之中。对于元宇宙&#xff0c;同样未能免俗。即使是那些处于头部的玩家&#xff0c;亦不例外。比如&#xff0c;扎克伯格就仅仅只是将元宇宙看成了一个将脸书带离泥潭的工具&#xff0c;一味地迎合资本&#xff0c;而最终忽略了元宇宙最本…

日常避坑--input输入框type=number仍可以输入“e“,“.“等符号

问题发现在使用ElementUI的input框时候&#xff0c;我们有时候需要只让用户输入数字类型。这个时候你可能就会想到<input type"number">,思路没错&#xff0c;但是踩着坑啦。我定义了一个number类型的input框但是&#xff0c;输入框仍旧可以输入"e",…

hadoop安装(二、hadoop)(备忘)

hadoop安装hadoop更改文件配置配置core-site.xml配置hadoop-env.sh配置hdfs-site.xml配置mapred-site.xml配置yarn-site.xml配置环境hadoop安装安装hadoop 紧接上文&#xff0c;解压过的hadoop內部文件为 再进入etc内部的hadoop 修改hadoop313的权限 在/opt目录下&#xff0…

分享24个网页游戏源代码,总有一个是你想要的

分享24个网页游戏源代码 24个游戏源代码下载链接&#xff1a;https://pan.baidu.com/s/1gYJlj8enJbh5mFS_wMaZBA?pwd4ncb 提取码&#xff1a;4ncb 下面是项目的名字&#xff0c;我放了一些图片&#xff0c;大家下载后可以看到。 Html5JS网页版捕鱼达人游戏 HTML5水果忍者游戏…