Java 如何限制双精度打印的小数位数?

Java 如何限制双精度打印的小数位数?,java,double,int,Java,Double,Int,这个程序可以运行,除非NJAR的数量是7的倍数,否则我会得到一个14.999999998美元的答案。对于6,输出为14.08。如何修复7的倍数的异常,使其显示14.99美元 import java.util.Scanner; public class Homework_17 { private static int nJars, nCartons, totalOunces, OuncesTolbs, lbs; public static void main(String[] args)

这个程序可以运行,除非NJAR的数量是7的倍数,否则我会得到一个14.999999998美元的答案。对于6,输出为14.08。如何修复7的倍数的异常,使其显示14.99美元

import java.util.Scanner;
public class Homework_17
{
 private static int nJars, nCartons, totalOunces, OuncesTolbs, lbs;

 public static void main(String[] args)
  {
   computeShippingCost();
  }

  public static void computeShippingCost()
  {
   System.out.print("Enter a number of jars: ");
   Scanner kboard = new Scanner (System.in);
   nJars = kboard.nextInt();
   int nCartons = (nJars + 11) / 12;
   int totalOunces = (nJars * 21) + (nCartons * 25);
   int lbs = totalOunces / 16;
   double shippingCost =  ((nCartons * 1.44) + (lbs + 1) * 0.96) + 3.0;

   System.out.print("$" + shippingCost);
   }
}

使用DecimalFormat类格式化双精度

将给你“0.99”。您可以在右侧加上或减去0,以获得更多或更少的小数

或者使用右边的“#”使附加数字成为可选数字,如#中的“#”。#(0.30)会将尾随的0删除为(0.3)。

您可以使用该方法。

检查十进制格式:

您将执行以下操作:

new DecimalFormat("$#.00").format(shippingCost);

或者,由于您使用的是货币,您可以看到
NumberFormat.getCurrencyInstance()
如何为您工作。

如果您想在控制台打印/写入双值,请使用
System.out.printf()
System.out.format()
方法

System.out.printf("\n$%10.2f",shippingCost);
System.out.printf("%n$%.2f",shippingCost);

格式化程序类也是一个不错的选择。格式(“%.2f”,变量); 这里显示了你想要的小数位数。例如,您可以将其更改为4。别忘了关闭格式化程序

 private static int nJars, nCartons, totalOunces, OuncesTolbs, lbs;

 public static void main(String[] args)
  {
   computeShippingCost();
  }

  public static void computeShippingCost()
  {
   System.out.print("Enter a number of jars: ");
   Scanner kboard = new Scanner (System.in);
   nJars = kboard.nextInt();
   int nCartons = (nJars + 11) / 12;
   int totalOunces = (nJars * 21) + (nCartons * 25);
   int lbs = totalOunces / 16;


   double shippingCost =  ((nCartons * 1.44) + (lbs + 1) * 0.96) + 3.0;

     Formatter fmt = new Formatter();
     fmt.format("%.2f", shippingCost);

   System.out.print("$" + fmt);

   fmt.close();

}

好的,我想的另一个解决方案只是为了好玩,就是把十进制数转换成一个字符串,然后把字符串分成两个字符串,一个包含点和小数,另一个包含点左边的Int。之后,将点和小数的字符串限制为3个字符,一个用于小数点,另一个用于小数。然后重新组合

double shippingCost = ((nCartons * 1.44) + (lbs + 1) * 0.96) + 3.0;
String ShippingCost = (String) shippingCost;
String decimalCost = ShippingCost.subString(indexOf('.'),ShippingCost.Length());
ShippingCost = ShippingCost.subString(0,indexOf('.'));
ShippingCost = ShippingCost + decimalCost;

那里!很简单,对吗?

因为这看起来像是家庭作业,所以我只给你一个提示:使用DecimalFormat类。使用Java提供的类有什么问题?它不是任何第三方类。IRL的副本您不应该在货币计算中使用浮点数。改用BigDecimal/long/int。请参见IMHO,当您打算使用
Double
时,不要使用
Double
“$%.2f”,因为它不会像
“$%10.2f”
那样打印任何前面的空格。无论如何+1。
double shippingCost = ((nCartons * 1.44) + (lbs + 1) * 0.96) + 3.0;
String ShippingCost = (String) shippingCost;
String decimalCost = ShippingCost.subString(indexOf('.'),ShippingCost.Length());
ShippingCost = ShippingCost.subString(0,indexOf('.'));
ShippingCost = ShippingCost + decimalCost;