double四舍五入保留两位小数

double四舍五入保留两位小数
double d1 = Math.round(4.015*100)/100.0;
为什么打印为4.01?
hunbecca 1年前 已收到1个回答 举报

bingbingsk 幼苗

共回答了16个问题采纳率:87.5% 举报

我猜测如下,因为4.015,小数部分的0.015表示成2进制数时是无限循环的,因此用double型表示4.015时,由于double的位数有限,所以只能用一个略小于4.015的数(肯定是略小于,因为只有位数无限时,这个2进制数才能等于0.015)去近似表示4.015,假设这个数是4.0149.,那么乘100后是401.49.,Math.round后是401.

1年前 追问

2

hunbecca 举报

我发现java api中没有个完整解决的方法 DecimalFormat df = new DecimalFormat("0.00"); String result = df.format(d); 当d为0.005结果为0.00

举报 bingbingsk

这里可能涉及到银行家四舍五入法,比如0.005四舍五入到小数点后2位时,如果第3位是5,会看第2位是偶数还是奇数,奇数则进位,偶数则不管。

hunbecca 举报

这个确实是这个问题 谢谢诶啊 不过double d1 = Math.round(4.015*100)/100.0; 那四舍五入有没有什么好的解决办法呐?

举报 bingbingsk

好像没什么好的解决办法,我用C和C++试过了,也不行。

hunbecca 举报

这种问题常出现啊只要是保留位数下一位是5就会出问题  四舍六入五成双是一种精确度的计数保留法.这里"四"是小于五的意思,"六"是大于五的意思,"五"是舍入位之后的尾数逢五的话看前一位,奇进偶不进。如1.25保留一位小数,因为2是偶数,所以是1.2。又如1.35,因为3是奇数,所以是1.4。
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 17 q. 0.026 s. - webmaster@yulucn.com