• 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#中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

  • 相关阅读:
    Numpy基本介绍
    Java中的<< 和 >> 和 >>> 详细分析
    Matplotlib绘制基本图像
    Matplotlib基本使用
    最新动态:开源项目 ionic3-awesome — 实现生成带logo二维码组件
    最新动态:开源项目 ionic3-awesome — 实现iframe嵌入外部网页
    最新动态: 开源项目 ionic3-awesome — 实现多主题功能
    Angular5强势来袭
    js中对象的拷贝,浅拷贝和深拷贝
    vue2 + element-ui + axios 开源项目推荐
  • 原文地址:https://www.cnblogs.com/keatkeat/p/16242952.html
Copyright © 2020-2023  润新知