【问题标题】:Android java set number of decimalsAndroid java设置小数位数
【发布时间】:2012-03-02 16:01:24
【问题描述】:

我有一个这样定义的可变价格:

   double price;
   price = 7.6;

到这里为止一切正常。问题是当我做这个时:

   price = 7.6 * 3;

我得到的是

   price = 22.799999999999999999999999997

而不是

   price = 22.80 

这是我需要的。

关于如何解决这个问题的任何想法?谢谢。

【问题讨论】:

    标签: java android double rounding


    【解决方案1】:

    使用BigDecimal 或以美分存储您的金额并使用long

    原因请阅读Effective Java Item 48

    总结: 当您需要精确值时,不要使用 doublefloat。这些数据类型不能代表十的负幂的数字。 (例如 0.1) 请改用BigDecimal。对于货币价值,longint 在大多数情况下更适合。

    您使用 long 的示例:

    long price; //store values in euro cents
    price = 760 * 3; //price is now 2280 cents
    

    【讨论】:

    • 如果可能,您需要将其存储为欧元。
    • 然后使用BigDecimal 或将您的欧元转换为欧分并使用long/intdoublefloat 用于科学计算。
    • @user1098933 BigDecimal.valueOf(price, 2).toPlainString() 你可能想看看Joda Money lib。
    【解决方案2】:

    切勿使用浮点数(双精度或浮点数)来计算货币值,因为浮点值在定义上是近似值。您应该将值存储在 int/long 中(例如 $ cents 而不是美元),或者使用专门为货币设计的类。

    这里有更多信息和细节: http://www.javapractices.com/topic/TopicAction.do?Id=13

    【讨论】:

    • 你能举个例子吗?我一直在网上寻找,但我发现它太复杂了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多