【问题标题】:Regarding double dataype关于双数据类型
【发布时间】:2010-03-02 09:15:14
【问题描述】:

我有一个双变量测试。我想提取小数点前的所有数字和小数点后的两位数,将输出存储在整数变量美元、美分中。我该怎么做?我不希望发生任何舍入。

示例:

double test= 12.1234

输出

int dollar =12;
int cents =12;

double test =1235.0

输出

int dollar=1235
int cents =0

【问题讨论】:

    标签: java string double


    【解决方案1】:

    对于货币,尤其是当您不想进行任何舍入时,您应该使用BigDecimal 类。比如:

    BigDecimal test = new BigDecimal("12.1234");
    int dollar = test.intValue();
    int cents = test.scaleByPowerOfTen(2).intValue() - dollar * 100;
    

    【讨论】:

    • 非常感谢您提供的信息。它适用于负数和非十进制值吗?测试=新BigDecimal(“-12.24”)测试=新BigDecimal(“2”);测试 =new BigDecimal("-2");我还通过自定义 API 函数从表中检索这个双精度值。此自定义 API 函数从表中检索 BigDecimal 值并执行 doubleValue() 返回双精度值。我无法更改此自定义 API 函数。在这种情况下,如果我转换为 Bigdecimal 并进行计算会导致任何问题吗? test=new BigDecimal(BigDecimal.valueof(doubleval));
    • 它也适用于整数和负值。当 API 函数将 BigDecimal 转换为 double 时会发生精度损失(为什么要这样做?)。我认为除了解决/扩展/覆盖 API 之外没有任何选项可以处理它。
    • 非常感谢。将尝试您的解决方案并通知您。
    • 我得到的输出是美元 = 12 美分 = 1212。我希望美分是 12。我该怎么做?
    【解决方案2】:

    你可以这样做:

    double test= 12.1234;
    int dollar = (int) test;
    int cents = (int) ((test-dollar) * 100);
    

    【讨论】:

    • 溢出、舍入误差和精度误差怎么办?双倍不适合存钱。
    • @Thomas:同意。 BigDecimal 是解决方案。
    【解决方案3】:

    怎么样:

    dollar = test;
    test -= dollar;
    cents = test * 100;
    

    第 1 行将 test (12) 的整数部分分配给整数“美元”。 第 2 行从测试值中删除 12 美元。 第 3 行将 test 小数部分的 100 倍分配给美分。请注意,我不在这里四舍五入。为此,您必须:

    cents = (test + 0.005) * 100
    

    【讨论】:

    • 第 1 行需要整数转换,否则您可能会丢失精度错误。
    【解决方案4】:

    这样的事情怎么样。您可以根据需要简单地分配它们,而不是打印这些值。

    double d = 32.456;
    System.out.println( (int)d );
    System.out.println( d-(int)d);
    

    【讨论】:

      【解决方案5】:
      String[] s = Double.toString(test).split(".");
      String dol = s[0];
      String cent = s[1].substring(0,1);
      

      【讨论】:

        【解决方案6】:

        对于大于10^13 的双精度值,名义小数点后不会有任何有效数字。

        您不应使用doublefloat 来表示财务数量。使用intlong(适当缩放并明确检查溢出)或BigDecimal

        【讨论】:

        • @arav - 溢出是指数字太大(正或负)而无法在计算中使用的数据类型中表示。例如,如果您使用 Java int 并将最大可表示的 int 值(2^31 - 1)加 1,则计算将静默溢出,您将得到否定结果;即-2^31
        猜你喜欢
        • 2011-05-16
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        相关资源
        最近更新 更多