Java 中的取近似值的方法

BigDecimal 对round方法(近似值取法)的定义

BigDecimal 类中定义了几种近似值的取法。

  • ROUND_UP 总是取远离0的值。假设我们要保留2位小数,那么使用本方法,则 0.12345 => 0.13;-0.12345=>-0.13。可以看到数的绝对值(magnitude)总是变大的

  • ROUND_DOWN 总是往0的方向取值。和ROUND_UP正好相反,假设我们要保留2位小数,那么使用本方法,则 0.12345 => 0.12;-0.12345=>-0.12。可以看到数的绝对值(magnitude)总是变小的

  • ROUND_CEILING ceiling 是天花板的意思,因此本方法总是会对着正无穷方向取值,即沿着X轴往右取值。例如 0.12345 => 0.13;-0.12345=>-0.12。取舍后的结果总是大于原值的,无论正负都是这样。

  • ROUND_FLOOR floor 是底板的意思,因此本方法和 ROUND_CEILING 正好相反,总是会对着负无穷方向取值,即沿着X轴往左取值。例如 0.12345 => 0.12;-0.12345=>-0.13。取舍后的结果总是小于原值的,无论正负都是这样。

  • ROUND_HALF_UP HALF 是一半的意思,因此 HALF UP 就是指当值正好落在两个数之间时,向上取值,这里的 UP 同 ROUND_UP 的含义,即向正无穷取值。其他情况取离值最近的数。例如做保留2位小数的取近似值操作,那么 0.253 => 0.25,0.255 => 0.26, 0.256 => 0.26, -0.123 => -0.12, -0.125 => -0.13, -0.126 => -0.123

  • ROUND_HALF_DOWN 和 ROUND_HALF_UP 在 HALF 情况下相反,向负无穷取值,其他情况相同。

  • ROUND_EVEN 著名的银行家算法,EVEN 是偶数的意思,如 2、4、6 等。具体取法是,取最近的数,除非和两侧的数距离都相同(严格对等),那么这时看被丢弃小数左侧的一位是奇数还是偶数。

    例如 0.12567 保留两位小数时,会丢弃 567 小数部分,那么被丢弃小数左侧的数字就是 2,是一个偶数。
    再比如 0.13567 保留两位小数时, 会丢弃 567 小数部分,那么被丢弃小数左侧的数字就是 3,是一个奇数。

    对于左侧数字是奇数的情况,向正无穷取值;对于左侧数字是偶数的情况,向负无穷取值。即“奇上(UP),偶下(DOWN)”,是不是很像“七上八下”。

    例如:0.123=>0.12, 0.124 => 0.12, 0.125 => 0.12, 0.135 => 0.14。因为对于 0.135 “被丢弃小数左侧的一位”是 3,是奇数,要向正无穷方向取值。

    注意 0.12567 => 0.13,为什么不是 0.12 呢,567 左侧数字是 2 是一个偶数呀。原因是 0.12567 对于0.12 和0.13而言,更靠近 0.13。只有严格距离相同时才能使用“七上八下规则”,如果是对 0.125 取近似值,那么结果就应该是 0.12。

    更多的HALF_EVEN例子:
    0.12567近似值: 0.13
    0.125近似值: 0.12
    0.13567近似值: 0.14
    0.135近似值: 0.14

String.format() 中的 %f 格式项(conversion)所用的取舍方法是 ROUND_HALF_UP/四舍五入

格式串的语法如下:

%[argument_index$][flags][width][.precision]conversion

当 conversion(格式项)是 f 时,Java 采取的近似值取法是 ROUND_HALF_UP 即四舍五入。

将 float 变量转换为 String 时没有使用明确的取舍方法

代码

float floatValue = 0.12345f;
String str = "value: " + floatValue;

会调用 Float.toString() 方法将 float 值转换为字符串,该方法会尽量让结果字符串接近真实值,也就是说小数的位数会非常多,不会进行截断。

参考

猜你喜欢

转载自blog.csdn.net/yangbo_hr/article/details/106397572
今日推荐