Java长期转换为货币

mcd*_*mcd 16 java currency number-formatting long-integer

我无法将长(美分)转换成货币格式.

我的代码:

long doublePayment = 1099;  //Should equal $10.99
DecimalFormat dFormat = new DecimalFormat();
String formattedString = dFormat.format(doublePayment);
System.out.println(formattedString);
Run Code Online (Sandbox Code Playgroud)

产量:1,099

我也尝试过:

long doublePayment = 1099;
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment);
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

由于这是美分,输出应为10.99或10.99美元.

无法弄清楚我做错了什么.谢谢!!!

Lau*_*uri 30

如果你很开始,你仍然应该使用java.math.BigDecimal.

    long doublePayment = 1099;
    BigDecimal payment = new BigDecimal(doublePayment).movePointLeft(2);
    System.out.println("$" + payment); // produces: $10.99
Run Code Online (Sandbox Code Playgroud)

让它再次大声说出:永远不应该使用浮点变量来存储货币/货币价值.

  • 我认为,银行确实使用一些整数或长整数来存储美分或分数,因为浮点运算确实会产生微小的错误,这在银行系统中是不允许的. (3认同)
  • 除了大多数投资银行使用“double”。C 或 C++ 中没有 BigDecimal,但很多系统使用 C 或 C++。;) (2认同)
  • 小错误不是随机错误.您可以预测它们的大小并使用适当的舍入.你是正确的长期和int也被使用,但这些是不太常见的恕我直言.我同意如果你不知道如何使用适当的舍入,那么使用BigDecimal. (2认同)

Pet*_*rey 22

要将美分兑换成美元,您可以使用

long doublePayment = 1099;
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment / 100.0);
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

这将准确高达70万亿美元.


Raf*_*ele 8

您的文字是1099,这是一千元,99,与Java规则整数文字应对.根据您的JVM语言环境,此数字用1,099.表示.如果你在欧洲,那就是1.099.所以,这不是输出的问题,而是你的输入.

问题是你必须代表一个固定的点值,但你不知道java.math.BigDecimal并试图伪造它.当你做一些计算时,事情就会破裂.不要这样做.

这就是你应该做的.简单(它的代码也少得多):

BigDecimal payment = new BigDecimal("10.99");
System.out.println(String.format("$%.2f", payment));
Run Code Online (Sandbox Code Playgroud)

请注意如何使用String初始化数字.此外,将处理当前的区域设置,或者您可以通过重载方法提供所需的区域设置.String.format()

  • 情况可能是,大卫有很长的分钱,那么他应该使用新的BigDecimal(doublePayment).movePointLeft(2); (3认同)

smi*_*ty1 8

这些答案都没有考虑到不同区域设置的货币具有不同的小数位数。例如,日元有零位小数,而约旦第纳尔有三位,当然,美元有两位。我认为这是一个更合适的解决方案:

\n\n
    long payment = 1099L;\n    BigDecimal bd = new BigDecimal(payment);\n\n    Locale jpLocale = new Locale("ja", "JP");//Japan\n\n    Currency jpCurrency = Currency.getInstance(jpLocale);\n    NumberFormat jpnf = NumberFormat.getCurrencyInstance(jpLocale);\n    int jpNumFractionalDigits = jpCurrency.getDefaultFractionDigits();\n\n    BigDecimal jpbd = bd.movePointLeft(jpNumFractionalDigits);\n\n\n    Locale usLocale = new Locale("en", "US");//United States\n\n    Currency usCurrency = Currency.getInstance(usLocale);\n    NumberFormat usnf = NumberFormat.getCurrencyInstance(usLocale);\n    int usNumFractionalDigits = usCurrency.getDefaultFractionDigits();\n\n    BigDecimal usbd = bd.movePointLeft(usNumFractionalDigits);\n\n\n\n    System.out.println(jpnf.format(jpbd)); //prints \xef\xbf\xa51,099\n    System.out.println(usnf.format(usbd));//prints $10.99\n
Run Code Online (Sandbox Code Playgroud)\n