Rounding
前言
以前写过一篇关于 Rouding 的 decimal, double, float, 但有点杂乱, 这篇做一个整理.
Why need rouding?
除法会诞生小数. 甚至会诞生无限小数 (除不完).
无限小数肯定是不行的, 计算机也存不了. 这时就需要 rouding.
即便不是无限, 如果计算的是价钱, 而且价钱必须用钱币支付, 那么小数位最多也只能是两位. 因为最小的钱币是分, 这时也需要 rounding.
跟小数有关的操作
加减乘 int 是不会出现小数的,除非其中一个数有小数.
除法很有可能会产生小数.
加减只会让小数变得更少 (因为进位)
乘法可能会让小数变多, 比如 1.22 * 1.33. 乘法其中一个是 int 就不会变多,只可能变少, 变多的情况不会无穷, 最大也只是 2个相加比如 1.22 * 1.33 最多是 4 为小数
加减乘是不会无穷小数的, 即便在乘 < 0 也不会无穷
只有除会产生无穷小数点.
When to round?
在做计算的时候, 要想清楚每一次的场景, 要 round to 几位, 人算和电脑算要一致。不然就会非常混乱了. 不要想说电脑能保留多少小数就保留多少, 电脑是会升级的, 而且不同地方小数位是不一样的, 要自己决定, 自己 round.
1 / 3 * 3 = ?
如果是 double 的话 JS, C# 都是等于 1
如果是 decimal 的话 C# 等于 0.999999....28 个 9
如果是 decimal Java 的话, 直接报错, Java 要求特别声明保留多少小数位和多余的要怎么 rounding 才不会报错 (严格才是对的)
参考: BigDecimal and “java.lang.ArithmeticException: Non-terminating decimal expansion”
各种 rounding 方式
参考: Rounding Methods
小学老师教过 "四舍五入",
5.4 舍去等于 5
5.5 进入等于 6
但其实世上还有许多其它的 rounding 方式. 关键都在中间点 5 的时候怎么处理, 每个 round 有不同的方式.
Half Round Up
四舍五入
5.4 = 5
5.5 = 6
当遇到 negative number 时, up 指向 positive, 所以

-5.4 = -5
-5.5 = -5 (half 指的是一半, 就是 点5 的时候, up 的方向是 posive (上图), 所以 -5.5 去 -5)
-5.6 = -6
Half Round Down
五舍六入
5.5 = 5
5.6 = 6
当遇到 negative number 时, up 指向 positive, 所以
-5.4 = -5
-5.5 = -6 (和上面不同, 这里是要去 down, 所以是往 negative 走, 就是 -6 咯)
-5.6 = -6
Round Half Away From Zero (common)

5.5 = 6
-5.5 = -6
Round Half Towards Zero
5.5 = 5
-5.5 = -5
Round to Even (bank)
在 half 的时候往 even 方向去 round
5.5 = 6 (之所以 round up to 6 是因为 6 是偶数)
6.5 = 6 (之所以 round down to 6 是因为 6 是偶数)
Round to Odd
在 half 的时候往 odd 方向去 round
5.5 = 5 (之所以 round down to 5 是因为 5 是奇数)
6.5 = 7 (之所以 round up to 7 是因为 7 是奇数)
Ceiling and Floor
Ceiling 是不管啥都 round up
5.1 – 5.9 = 6
-5.1 – -5.9 = -5 (往 position 走是 up)
Floor 是不管啥都 round down
5.1 – 5.9 = 5
5.1 – 5.9 = -6
C# 的 rounding
C# 默认的 rounding 是 Round to Even, 大部分 bank 喜欢的.
另外它还支持, Away From Zero 和 Towards Zero

ToNegativeInfinity 和 ToPositiveInfinity 我倒是不清楚是什么来的.
big.js 的 rounding
big.js 只支持 Round to Even, Away From Zero, Ceiling 和 Floor,默认是 1。

如果需要支持更多 rounding 可以使用 bignumber.js, decimal.js。它们都是姐妹版本来的。
Rounding的更多相关文章
- hdu 1036 (I/O routines, fgets, sscanf, %02d, rounding, atoi, strtol) 分类: hdoj 2015-06-16 19:37 32人阅读 评论(0) 收藏
thanks to http://stackoverflow.com/questions/2144459/using-scanf-to-accept-user-input and http://sta ...
- Codeforces Round #204 (Div. 2)->C. Jeff and Rounding
C. Jeff and Rounding time limit per test 1 second memory limit per test 256 megabytes input standard ...
- CodeForces 352C. Jeff and Rounding(贪心)
C. Jeff and Rounding time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...
- Codeforces Round #451 (Div. 2)-898A. Rounding 898B.Proper Nutrition 898C.Phone Numbers(大佬容器套容器) 898D.Alarm Clock(超时了,待补坑)(贪心的思想)
A. Rounding time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- SAP MM 物料主数据MRP2 视图Rounding Value字段
SAP MM 物料主数据MRP2 视图Rounding Value字段 如下物料号,MRP2视图中,维护了rounding value字段值为50. MRP type :PD Lot size:EX ...
- python decimal.quantize()参数rounding的各参数解释与行为
我最开始其实是由于疑惑ROUND_FLOOR和 ROUND_DOWN的表现区别才看了一波文档,但是感觉拉出一票以前没有留意过的东西. 贴一个decimal文档里面的解释: ROUND_CEILING ...
- CF&&CC百套计划3 Codeforces Round #204 (Div. 1) A. Jeff and Rounding
http://codeforces.com/problemset/problem/351/A 题意: 2*n个数,选n个数上取整,n个数下取整 最小化 abs(取整之后数的和-原来数的和) 先使所有的 ...
- CF898A Rounding
题意翻译 给你一个数字,将其“四舍六入”,末尾为5舍去或进位都可,求最终的数字. 题目描述 Vasya has a non-negative integer n n n . He wants to r ...
- Codeforces 898 A. Rounding
A. Rounding time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Codeforces Round #451 (Div. 2) A. Rounding【分类讨论/易错】
A. Rounding time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
随机推荐
- 权威技术社区InfoQ列网易数帆为年度最有价值技术团队,技术实力获广泛认可
近日,权威技术社区InfoQ公布数字化转型技术服务商网易数帆为2020年最有价值技术团队,并被授予"最佳技术社区驱动力奖",认可网易数帆在技术领域的突出成就和实力. Inf ...
- Nginx使用upstream实现动静分离
一.为什么要进行动静分离 分离资源,减少不必要到的请求消耗,减少请求延时. 注:我这里,是nginx处理静态资源,apache处理动态资源. 场景分析: 1.未分离之前的场景步骤 (1)客户端请求ur ...
- Django 自定义创建密码重置确认页面
要实现上述功能,你需要修改模板文件以添加"忘记密码"链接,并创建新的视图函数来处理密码丢失修改页面.验证和密码修改.下面是你可以进行的步骤: 1. 修改模板文件 在登录页面的表单下 ...
- <script> 和 <script setup> 的一些主要差别
<script setup> 是 Vue 3 中的新特性,它是一种简化和更具声明性的语法,用于编写组件的逻辑部分.相比之下,<script> 是 Vue 2 中常用的编写组件逻 ...
- Docker 容器数据:持久化
Docker 容器数据:持久化 每当从镜像创建容器时,它都会创建一个新容器,除了镜像数据之外没有任何数据 意味着如果在提交更改之前删除容器,我们将丢失数据 Docker 应该存在一种将数据的文件系统与 ...
- 写写stream流的终结操作
终结操作和中间操作的区别:中间操作返回的一直都是stream,所以可以一直使用,但是终结操作返回的不是stream,后面不能继续操作 foreach:对流中的所有元素进行遍历操作 count:获取当前 ...
- 2023/4/20 SCRUM个人博客
1.我昨天的任务 学习了PYQT5的部分控件,例如按钮,文本框,文本编辑框,并了解了一些基础布局以及部分对窗口的自定义实现 2.遇到了什么困难 无法理解信号和槽的概念 3.我今天的任务 学习信号和槽的 ...
- Linux 破解mysql密码
mysql忘记密码怎么办 [root@master ~]# mysql -uroot -pHuawei123123$ mysql: [Warning] Using a password on the ...
- python 音频处理(1)——重采样、音高提取
采集数据->采样率调整 使用torchaudio进行重采样(cpu版) 首先导入相关包,既然使用torch作为我们的选项,安装torch环境我就不必多说了,如果你不想用torch可以使用后文提到 ...
- 趣谈n++与++n的differences
前言:今天小白在学习时无意发现一组有趣的孪生兄弟** n++ 与 ++n** 探索:二者不同之处 工具:VS2022 过程: 前者是++n,输出11,12,13,14 后者是n++,输出10,11,1 ...