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

2018-01-16 11:17:47 +08:00
 fangch

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

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

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

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

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

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

要么是它的表现形式。

要么是不使用浮点数,而是用 biginteger (把 0.01 当作精度)或者你自行定义的类(这种情况下你可以任意定义这种数的特性)进行计算,表现。
fangch
2018-01-16 15:47:06 +08:00
@honeycomb 哦哦,了解了,非常感谢
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

不考虑精度也可以四舍五入

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/423250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX