一个计算Java问题,求解

JC_404 发布于 2012/02/29 12:55
阅读 355
收藏 0

我在计算一个数的时候出现 一个java计算的问题

我本来想计算 38.80*100-1=3879 求其整数结果

但是:

new BigDecimal(38.80).multiply(new BigDecimal(100)).subtract(new BigDecimal(1)).longValue()

(long)(38.80*100-1)

Java算出来的结果都是:3878

求解?怎样才能算出是3879呢?

 

以下是问题补充:

@JC_404:感动得泪流满面,本来只是想解决问题而已,结果连前因后果都刨出来了 (2012/02/29 22:20)
加载中
1
去你麻痹的OSC
去你麻痹的OSC

关键是:有人已经说了:ew BigDecimal 一定要用字符串形式,不要用基本类型

new BigDecimal("38.80").multiply(new BigDecimal(“100”)).subtract(new BigDecimal(“1”)).setScale(0)

1
鉴客
鉴客
对这种小数的计算,最好每个数都乘100变成整数,最后再除100
0
b
birdcity
new BigDecimal("38.80").multiply(new BigDecimal(100)).subtract(new BigDecimal(1)).longValue()
0
b
buptwhis
new BigDecimal 一定要用字符串形式,不要用基本类型,详细请参考api
0
liuex
liuex

不要使用"(long)"这种方式强制转换,从浮点数到整数的强制转换是向下取整,相当于Math.floor(doubel value)。你应该使用使用Math.round(double d)的方式四舍五入取整。

这个问题的根源还是在于浮点数的二进制表达问题,比如十进制的浮点数x=0.1,使用二进制表示的时候是一个无限循环小数,因此不可能使用4此节或者8字节精确表示出来,导致实际存储的二进制浮点数可能是类似x=0.0999999999999999998这样的形式的,所以x*10 = 0.999999999999999999...8,而((int)x*10 = 0),就是楼主出现的那种情况

0
三阶魔方
三阶魔方

引用来自“田波”的答案

new BigDecimal 一定要用字符串形式,不要用基本类型,详细请参考api
new BigDecimal("38.80").multiply(new BigDecimal("100"))
    .subtract(new BigDecimal("1")).longValue();

经测试,结果为3879。

0
无心睡眠
无心睡眠

看一下java doc:

longValue

public long longValue()
Converts this BigDecimal to a long. This conversion is analogous to a  narrowing primitive conversion from double to short as defined in the  Java Language Specification: any fractional part of this   BigDecimal   will be discarded, 
返回顶部
顶部