当前位置: 首页 > 知识库问答 >
问题:

计算BMI和如何防止浮点四舍五入(Java)

卢志业
2023-03-14

问题是,每当我使用“System.out.printf(”%.2F\n“,BMI)”时,输出将四舍五入,而不是切断小数点的其余部分。下面是我的代码:

import java.util.Scanner;
public class Main
{

    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        double weight = input.nextDouble();
        double height = input.nextDouble();

        double weightKG;
        double heightM;
        double heightMSquare;
        double BMI;

        final double kilogram = 0.45359237;
        final double meter = 0.0254;

        while ((weight > 200) || (weight < 50)) // Error catching code.
        {
            weight = input.nextDouble();
        }
        while ((height > 100) || (height < 10))
        {
            height = input.nextDouble();
        }

        weightKG = weight * kilogram; // Convert pounds and inches to 
kilograms and meters.
        heightM = height * meter;

        heightMSquare = Math.pow(heightM, 2); // Compute square of height in 
meters.

        BMI = weightKG / heightMSquare; // Calculate BMI by dividing weight 
by height.

        System.out.printf("%.2f\n", BMI);
    }
}

共有1个答案

呼延哲
2023-03-14

下面是我编写的一个方法,它通过正则表和字符串操作来解决这个问题。

private static String format2Dp(double x) {
    String d = Double.toString(x);
    Matcher m = Pattern.compile("\\.(\\d+)").matcher(d);
    if (!m.find()) {
        return d;
    }
    String decimalPart = m.group(1);
    if (decimalPart.length() == 1) {
        return d.replaceAll("\\.(\\d+)", "." + decimalPart + "0");
    }
    return d.replaceAll("\\.(\\d+)", "." + decimalPart.substring(0, 2));
}

我所做的是将double转换成字符串,从其中提取小数部分,并对小数部分进行子串。如果小数部分只有1个字符长,则在末尾添加一个零。

这种方法也适用于用科学符号表示的数字。

 类似资料:
  • 例如,当我在控制台中运行0.1+0.2时,它返回0.300000000000000004。然而,当我运行0.1+0.3时,它正确地返回0.4。 是否有任何逻辑可以确定哪些特定的浮动不会被“正确”舍入?

  • C和C++提供了几种宽度的浮点数据类型,但它们没有指定精度。编译器可以自由地使用理想化的算术来简化表达式,使用双精度来计算值上的表达式,或者使用双精度寄存器来保留变量或公共子表达式的值。 纠正我如果我是错的是错的,请参见编辑,但是将内存中的提升到双精度寄存器中也是合法的,所以存储一个值然后加载回来并不一定会截断位。 将一个数字转换成一个较低精度的最安全、最便携的方法是什么?理想情况下,在SSE2上

  • 问题内容: 假设我有,我想将其转换为。如何在Python中完成此操作? 给与不。我是Python或一般编程的新手。 我不想将其打印为字符串,结果将被进一步使用。有关此问题的更多信息,请查看 Tim Wilson的Python编程技巧:贷款和付款计算器 。 问题答案: (或的结果)正确舍入为小数点后两位。数学上,这听起来像您想要的是天花板功能。Python模块中的一个名为: 地板和天花板功能通常分别

  • 我将货币值作为浮动存储在mysql表中。 问题是,mysql正在向上或向下舍入数字。 例如,12345.68四舍五入为12345.7 如何停止此操作,或者是否应该使用更好的数据类型? 我希望将原始值保留在小数点后2位以内。

  • 本节讨论了精度数学的四舍五入特性,ROUND()函数,以及插入DECIMAL列时的四舍五入特性。 ROUND()函数的行为取决于其参量是准确的还是近似的: ·对于准确值数值,ROUND()采用“半值向上舍入”规则:如果小数部分的值为.5或更大,如果是正数,向上取下一个整数,如果是负数,向下取下一个整数(换句话讲,以0为界限执行舍入)。如果小数部分的值小于.5,如果是正数,向下取下一个整数,如果是负

  • 我写了这段代码,它只是对n个数字的列表进行求和,以练习浮点运算,但我不明白这一点: 我正在使用float,这意味着我有7位精度,因此,如果我执行10002*10002=100040004的操作,数据类型float的结果将是100040000.000000,因为我丢失了第7位以外的任何数字(程序仍然知道指数,如图所示)。 如果此程序中的输入是 然而,您将看到,当这个程序计算30003*30003=9