前言

以前写过一篇关于 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#中Math.Round四舍五入的用法详解

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.jsdecimal.js。它们都是姐妹版本来的。

Rounding的更多相关文章

  1. 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 ...

  2. 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 ...

  3. CodeForces 352C. Jeff and Rounding(贪心)

    C. Jeff and Rounding time limit per test:  1 second memory limit per test: 256 megabytes input: stan ...

  4. 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 ...

  5. SAP MM 物料主数据MRP2 视图Rounding Value字段

    SAP MM 物料主数据MRP2 视图Rounding Value字段 如下物料号,MRP2视图中,维护了rounding value字段值为50. MRP type :PD Lot size:EX ...

  6. python decimal.quantize()参数rounding的各参数解释与行为

    我最开始其实是由于疑惑ROUND_FLOOR和 ROUND_DOWN的表现区别才看了一波文档,但是感觉拉出一票以前没有留意过的东西. 贴一个decimal文档里面的解释: ROUND_CEILING ...

  7. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) A. Jeff and Rounding

    http://codeforces.com/problemset/problem/351/A 题意: 2*n个数,选n个数上取整,n个数下取整 最小化 abs(取整之后数的和-原来数的和) 先使所有的 ...

  8. CF898A Rounding

    题意翻译 给你一个数字,将其“四舍六入”,末尾为5舍去或进位都可,求最终的数字. 题目描述 Vasya has a non-negative integer n n n . He wants to r ...

  9. Codeforces 898 A. Rounding

      A. Rounding   time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  10. 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 ...

随机推荐

  1. Apache Hudi X Apache Kyuubi,中国移动云湖仓一体的探索与实践

    分享嘉宾:孙方彬 中国移动云能力中心 软件开发工程师 编辑整理:Hoh Xil 出品平台:DataFunTalk 导读:在云原生 + 大数据的时代,随着业务数据量的爆炸式增长以及对高时效性的要求,云原 ...

  2. AI驱动音乐创新,网易数帆X云音乐刷新MIREX世界纪录 网易数帆 网易数帆

    在近期揭榜的2021国际音频检索评测大赛(MIREX)上,网易数帆易智语音团队携手网易云音乐音视频实验室,凭借生产级AI技术创新能力,在歌词识别和歌单识别两个赛道大幅打破世界纪录夺得冠军. MIREX ...

  3. [oeasy]python0127_中文系统_gbk_BIG5_南极星_内码转化

    中文系统bgk 回忆上次内容 汉字字形通过 点阵式打字机 像素级寻址的屏幕 进入了计算机的世界   ​   添加图片注释,不超过 140 字(可选)   在海峡对岸的台湾同胞 也进入了汉字时代   他 ...

  4. [oeasy]python0124_Code_page_437_IBM_5150_点阵式字形码_显示器效果

    字符显示器 回忆上次内容 简体和繁体的汉字 字符数量都超级大 感谢王选和陈堃銶等前辈发明了激光照排技术 中文排版从此使用上了gb2312编码   ​   添加图片注释,不超过 140 字(可选)   ...

  5. LLM并行训练6-激活优化

    前置知识 Activation 激活指的是一些在fp时计算得到的临时tensor, 会用于bp时的计算. 如果能在fp计算后把临时tensor缓存下来就可以加速bp, 缺点在于某些激活会占用大量显存. ...

  6. Python pluggy框架基础用法总结

    代码为例进行说明 实践环境 Python 3.6.5 pluggy 0.13.0 例1 注册类函数为插件函数 #!/usr/bin/env python # -*- coding:utf-8 -*- ...

  7. 实验6-使用TensorFlow完成线性回归 cannot import name ‘OrderedDict‘ from ‘typing‘错误的解决方法

    找到对应的报错方法 删除 再添加from typing_extensions import OrderedDict

  8. 【Python】GUI开发笔记

    一.环境搭建: 1.Pycharm开发工具 pycharm历史版本 https://www.jetbrains.com/pycharm/download/other.html 破解插件 https:/ ...

  9. 跨平台字幕制作软件ARCTIME

      官网:http://arctime.cn/

  10. ubuntu22.04 终端显示数字剑雨

    数字剑雨是读大学时候常用的屏保,这些年基本也再没有用过,不经意间想到了这个曾经的屏保,发现Ubuntu原版的桌面系统是没有屏保的,又不想换桌面系统,想想还是单独安装一下这个数字剑雨吧. 在Ubuntu ...