JavaRush /Java 博客 /Random-ZH /Java 中的四舍五入数字

Java 中的四舍五入数字

已在 Random-ZH 群组中发布
浮点数(float、double)用于计算需要小数精度的表达式。会计和其他计算操作通常需要高精度。 Java 中的四舍五入数字 - 1但是我们总是需要小数点后的数字长“尾巴”吗?也许三个实部的精度对我们来说就足够了?我们对这个选项很满意,如何正确地进行舍入呢?这正是我们今天要讨论的内容:我们将研究在 Java 中对数字进行舍入的方法

字符串格式

作为第一种方法,我们将研究舍入双精度:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
结果,我们将以3 位小数的精度格式化浮点数 34766674 ,因为在格式化指令中我们指定了 3 位小数“%.3f。反过来,格式化字符串时的 %f 表示浮点类型数字,包括Java中的数据类型doublefloat。在上面的例子中,我们将结果值输出到控制台。现在的问题是:我们如何缩短它?很简单:你需要使用printf,而printf又就是格式+打印,这样一来,前面我们的例子就会简化为:
double value = 34.766674;
System.out.printf("%.3f",value);
除了这个方法之外, PrintStream类 的out实例还有一个format方法,其工作原理类似:
double value = 34.766674;
System.out.format("%.3f",value);
舍入发生在HALF_UP 模式中- 朝更接近被截断的数字(0 或 10)进行舍入。如果这些数字等距(在 5 的情况下),则向上舍入。例子:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
我们将在下面更详细地讨论舍入模式。 Java 中的四舍五入数字 - 2

十进制格式

另一种选择是使用DecimalFormat类。它旨在格式化 Java 中的任何数字,无论是整数还是浮点数。当我们实例化DecimalFormat 时,我们可以向它传递一个格式字符串。它将指示要为输入设置格式的小数位数。这就是我们使用DecimalFormat 的示例:
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### 行是一种模式,指示我们将传递的值格式化为小数点后 3 位。要在创建 DecimalFormat 对象后更改模式,可以使用其applyPatternapplyLocalizedPattern方法:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
但今天我们讨论的是舍入,不是吗?当截断小数位数超出指定模式的数字时,如果最后截断的数字大于 5,则DecimalFormat会将数字向上舍入。但是如果数字是 5 呢?事实证明,它恰好位于最接近的整数之间的中间。然后怎样呢?在这种情况下,会考虑之前的数字。如果是偶数,则进行舍入:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
如果是奇数,则不执行:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
使用 String.format() 和 DecimalFormat.format() 格式化浮点数之间存在细微差别。即使没有小数部分,第一个也将始终打印尾随零。例如:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
我们可以看到,当将数字 7.000132 格式化为小数点后三位时,String 的 format() 方法将输出 7.000,而 DecimalFormat 的 format() 方法将输出 7。也就是说,您可以选择String.format()DecimalFormat。 )取决于您是否需要尾随零。使用上述方法,我们收到了字符串形式的结果。让我们看看如何准确返回数值。

数学

不能不提到一个为各种数字算术运算量身定制的特殊类 - MathJava 中的四舍五入数字 - 3该类还具有舍入方法,但与已经描述的方法不同,它们不允许您设置一定数量的小数位数,而是舍入为整数:
  • Math.ceil()向上舍入到最接近的整数,但返回的不是整数类型,而是双精度数:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    即使我们有 34.0000000,使用Math.ceil后我们仍然会得到 35.0。

    Math.floor() 向下舍入到最接近的整数,同时返回双精度结果:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    同样,即使我们的值为 34.999999999,那么使用Math.floor后我们将得到 34.0。

  • Math.round () - 四舍五入到最接近的整数,给出结果 int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    如果我们的数字是 34.5,则四舍五入为 35,但如果略小于 34.499,则该数字将被截断为 34。

    为了不是简单地截掉整个实部,而是将此过程调节到一定数量的小数位,同时将数字乘以 10^n(10 的 n 次方),其中 n等于所需的小数位数。之后,使用Math类的一些方法进行舍入,然后再次除以 10^n:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - 采用两个参数。第一个是数字,第二个是需要提升到的功率。

使用 BigDecimal 舍入

BigDecimal是一个允许您使用浮点数的类。特别是,它的主要特点是可以存储任意长度的小数(即数字的范围没有限制)。此外,该类还存储各种算术处理方法,包括舍入。可以通过将构造函数设置为 double、显示浮点数的 string、double 和MathContext等来创建该对象的类。 MathContext是RoundingMode和描述搜索值中总位数的数字的组合。舍入规则 RoundingMode: 向下- 向零舍入。 UP——从零模式舍入。 CEILING - 向正无穷大舍入。 FLOOR - 朝负无穷大舍入。 HALF_UP - 如果两个邻居不等距(即,当舍入的数字为 5 时),舍入到“最近的邻居”。在这种情况下,执行向上舍入。 HALF_DOWN - 向“最近的邻居”舍入。如果两个邻居不等距,则在这种情况下向下舍入。 HALF_EVEN - 如果两个邻居不等距,则四舍五入到“最近的邻居”。在这种情况下,舍入到偶数邻居(如上述 DecimalFormat 中所述)。 UNNECESSARY - 用于确认请求的操作具有正确的结果。因此,不需要四舍五入。例子:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
除了能够在构造函数中设置舍入规则之外,BigDecimal还允许您在创建实例后设置舍入模式。为此,请使用setScale方法,在该方法中您需要设置小数位数和舍入规则:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal 还具有内部int变量,旨在设置舍入模式(ROUND_DOWNROUND_CEILINGROUND_FLOOR ...),这些变量表示与RoundingMode类中提供的舍入规则类似的舍入规则,并且在setScale中也有类似的使用:
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
在本文 中阅读有关 BigDecimal 类的更多信息。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION