为什么我的格式这么奇怪?

问题描述 投票:0回答:2

我的代码格式有问题。最后,它应该打印出结果。我正在使用 printf 语句,但它返回的数字并不像我需要的那么精确。例如,如果一个数字应为 76.83200000000001,则返回结果为 76.83200。它还在数字末尾添加不必要的零,如果数字应该是 28.0,它就会变成 28.000000。如果可能的话,我们可以在没有

BigDecimal
变量的情况下做到这一点吗?这是到目前为止我的代码(注意:一些字符串前面有空格,那是因为我提交的网站出于某种原因需要这样做):

import java.util.Scanner;
public class Population {
    public static void main(String[] args) {
        Scanner stdin = new Scanner(System.in);
        double startingNumber, dailyIncrease, daysWillMultiply, temp, population;
        
        System.out.print("Enter the starting number organisms: ");
        startingNumber = stdin.nextDouble();
        while(startingNumber < 2) {
            System.out.print("Invalid. Must be at least 2. Re-enter: ");
            startingNumber = stdin.nextDouble();
        }
        
        System.out.print("Enter the daily increase: ");
        dailyIncrease = stdin.nextDouble();
        while(dailyIncrease < 0) {
            System.out.print("Invalid. Enter a non-negative number: ");
            dailyIncrease = stdin.nextDouble();
        }
        
        System.out.print("Enter the number of days the organisms will multiply: ");
        daysWillMultiply = stdin.nextDouble();
        while(daysWillMultiply < 1) {
            System.out.print("Invalid. Enter 1 or more: ");
            daysWillMultiply = stdin.nextDouble();
        }
        
        
        temp = startingNumber * dailyIncrease;
        population = startingNumber;
        
        System.out.println("Day\t\tOrganisms");
        System.out.println("-----------------------------");
        System.out.println("1\t\t" + startingNumber);
        for (int x = 2; x <= daysWillMultiply; x++) {
            population += temp;
            temp = population * dailyIncrease;
            System.out.printf(x + "\t\t%f\n", population);
        }
    }
}
java formatting printf number-formatting
2个回答
1
投票

好吧,我删除了之前的答案,因为它绝对是错误的(感谢@JohnKugelman 指出了这一点)。我认为转换为

float
会导致精度丢失,但事实并非如此。

根据 formatter 文档,以下是使用

%f
标志时会发生的情况:

  • 幅度 m(参数的绝对值)的格式为 m 的整数部分,没有前导零,后跟 小数点分隔符后跟一位或多位小数位,表示 m.

  • 的小数部分
  • m小数部分的结果位数等于精度。 如果没有指定精度则 默认值为 6

  • 如果精度小于将出现的位数 返回的字符串中小数点后 分别为

    Float.toString(float)
    Double.toString(double)
    , 那么该值将使用向上舍入算法进行舍入。 否则,可能会附加零以达到精度。

这就是为什么你会得到不必要的零并削减数字。

文档建议使用

Float.toString(float)
Double.toString(double)
作为值的规范表示。

如果您想使用

System.out.printf(...);
,您只需将
%f
标志替换为
%s
- 在这种情况下,参数将被转换为字符串(结果是通过调用参数的
toString()
方法获得的,并且这就是你所需要的)。例如,您可以重写这一行:

System.out.printf(x + "\t\t%f\n", population); 

如下:

System.out.printf("%d\t\t%s\n", x, population);

这将打印您的

population
的准确值。


0
投票

查看该主题的第一个答案,可能会有所帮助。

java中浮点型和双精度型有多少位有效数字?

重要的是要了解精度并不统一,并且 这不是像整数那样精确地存储数字。

© www.soinside.com 2019 - 2024. All rights reserved.