V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fangch
V2EX  ›  Java

Java 中 double 类型的保留两位小数,结果也要是 double 类型,这样的如何实现?

  •  
  •   fangch · 2018-01-16 11:17:47 +08:00 · 6185 次点击
    这是一个创建于 2538 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我看到网上的大多数的例子中都是转成 bigDecimal,或者 string,但是再转成 double 类型之后,整数的 0 会掉。
    比如说 7.00 ,用 Double.valueOf()或者用 Double.parseDouble()之后,就变成 7.0 了。
    请教一下如何使整数也变成两位 double 类型的小数

    15 条回复    2018-01-17 08:17:52 +08:00
    rensuperk
        1
    rensuperk  
       2018-01-16 11:40:36 +08:00   ❤️ 1
    1. 看 bigDecimal 提供的方法,里面有进位的规则和保留位数的参数。
    2. 不建议用浮点类型进行计算。因为有误差。
    3. double 带小数的整数输出也会给你截取最后的几个 0。
    anthow
        2
    anthow  
       2018-01-16 11:42:30 +08:00   ❤️ 1
    DecimalFormat
    honeycomb
        3
    honeycomb  
       2018-01-16 11:43:58 +08:00 via Android   ❤️ 1
    对于 double/float 而言,给它赋值 7.00 和 7.0 是没有区别的。

    要关注的是输出格式( double.tostring()是可以指定格式的),比如你要求它强制输出小数点后两位,那么无论 biginteger 还是浮点数还是两者混着用都能做到。

    特别的,如果你要严格保证计算精度的稳定性时(小数点第二位四舍五入,再小的位放弃),从头到尾不碰浮点数比较合适。

    和数据类型没有必然关系。
    vjnjc
        4
    vjnjc  
       2018-01-16 11:48:29 +08:00   ❤️ 1
    楼上+1,在输出成 string (/display )的时候转换精度即可
    fangch
        5
    fangch  
    OP
       2018-01-16 12:00:10 +08:00
    @rensuperk ok 好的,我去看看
    @honeycomb @vjnjc ok,我试试,非常感谢
    jason19659
        6
    jason19659  
       2018-01-16 12:02:31 +08:00
    保存 和 输出 不要弄混
    facetest
        7
    facetest  
       2018-01-16 12:04:12 +08:00 via Android
    没那么麻烦吧,乘以 100,转成整数,再转成 double 除以 100。当然这是没有四舍五入的。
    fangch
        8
    fangch  
    OP
       2018-01-16 12:13:40 +08:00
    @jason19659 嗯嗯,谢谢提醒
    @facetest 这样的我试过了,不行的
    helloit
        9
    helloit  
       2018-01-16 13:02:38 +08:00
    DecimalFormat decimalFormat = new DecimalFormat("0.00");
    String value = decimalFormat.format(xxx);
    honeycomb
        10
    honeycomb  
       2018-01-16 13:07:26 +08:00 via Android
    @fangch 你楼下的 @helloit 指出方法了,用 decimalformat
    fangch
        11
    fangch  
    OP
       2018-01-16 14:06:19 +08:00
    @helloit 非常感谢,这种方法我已经试过了,但是返回的是 string,把 string 转成 double 就变了
    @honeycomb 好的
    honeycomb
        12
    honeycomb  
       2018-01-16 15:12:56 +08:00
    @fangch

    你确定理解 @helloit 的意思了么?你确定理解了上面回答的意思了吗?

    "
    helloit 1 小时 56 分钟前
    DecimalFormat decimalFormat = new DecimalFormat("0.00");
    String value = decimalFormat.format(xxx);
    "

    再看一遍,再想一想

    “但是返回的是 string,把 string 转成 double 就变了”

    你要的是什么?
    你要的是输出为 7.00 的 float 数或者 double

    所以,你先想一下什么是浮点数的概念:
    浮点数实际上是一个二进制意义上的科学记数法,并且指定了小数位的精度。

    比如 IEEE754 版本的浮点数的小数位是由低位的 23 个比特定义的。

    所以,默认情况下,你用 toString()的意思,是让它用十进制表达这个二进制的科学计数,那么:

    它只要能用 7.0 表达,就绝不会用 7.00 表示,除非你刻意地指定让它以保留两位小数的形式。

    这里的刻意才是 @helloit 提到的用 DecimalFormat 的目的
    honeycomb
        13
    honeycomb  
       2018-01-16 15:36:01 +08:00 via Android
    @fangch

    环境提供的浮点数类型的变量的精度不以你的意志为转移,所以你能考虑的精度:

    要么是它的表现形式。

    要么是不使用浮点数,而是用 biginteger (把 0.01 当作精度)或者你自行定义的类(这种情况下你可以任意定义这种数的特性)进行计算,表现。
    fangch
        14
    fangch  
    OP
       2018-01-16 15:47:06 +08:00
    @honeycomb 哦哦,了解了,非常感谢
    grq100296
        15
    grq100296  
       2018-01-17 08:17:52 +08:00
    强制格式化

    DecimalFormat df = new DecimalFormat("######0.00");

    double d1 = 3.23456
    double d2 = 0.0;
    double d3 = 2.0;
    df.format(d1);
    df.format(d2);
    df.format(d3);

    结果
    3.23
    0.00
    2.00

    不考虑精度也可以四舍五入
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:28 · PVG 13:28 · LAX 21:28 · JFK 00:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.