java价格处理的一个问题

本文探讨了在Java中处理浮点数时遇到的精度问题,特别是当涉及到货币计算时。通过实例展示了直接使用double类型进行乘法运算可能导致的误差,并提供了一种正确的解决方案:使用Math.round方法进行四舍五入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  我们经常会处理一些价格,比如从运营上传的文件中将某个字段从字符串转为double类型,那么此时处理价格需要特别注意,比如4.6,我们通过Double.valueOf(value)来转换,然后系统是用分为单位来存储价格信息,那么我们会将(long)(Double.valueOf(value)*100)来存储,此时4.6存储到系统就变成459了,然后再转换回来就出错了。

 

public class FloatTest {
	
	public static void main(String[] args) {
		for(int i = 0; i < 10; i++){
			String value="4." + i;
			System.out.println(Double.valueOf(value) * 100);
//			System.out.println(Double.valueOf(Double.doubleToLongBits(Double.valueOf(value))) * 100);
			System.out.println((long)(Double.valueOf(value) * 100));
			System.out.println(Math.round(Double.valueOf(value) * 100));	
		}
	}

}

 

400.0
400
400
409.99999999999994
409
410
420.0
420
420
430.0
430
430
440.00000000000006
440
440
450.0
450
450
459.99999999999994
459
460
470.0
470
470
480.0
480
480
490.00000000000006
490
490

 4.1和4.6就出错了,正确方式应该用Math.round来四舍五入。

转载于:https://www.cnblogs.com/zhwj184/archive/2013/03/26/3027424.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值