java判断字符串是否是bigdecimal
double科学记数法?
double科学记数法?
Java语言中的Double类型,在使用过程中会出现大数据自动转换成科学计数法表示的现象,例如:零钱宝在调用转账时,取数据库中的转账金额(单位:分),
Java的实体类使用的是Double类型,从数据库取出来后直接就变成了Double类型,因为金额是以分为单位,所以需要去除小数点后面的数值,如果金额大于等于10万元时,
就会出现Double类型自动转换成科学记数法表示的现象,如果此时盲目的去除小数点后面数值就会造成金额变小的情况。
为什么java的BigDecimal也无法精准计算double类型吗?
不要使用double来构造一个BigDcimal对象。BigDecimal的构造函数有这么一段说明:
The results of this constructor can be somewhat unpredictable. One might assume that writing in Java creates a which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances constructor, on the other hand, is perfectly predictable: writing creates a which is exactly equal to 0.1, as one would expect. Therefore, it is generally recommended that the String constructor be used in preference to this one.由于double本身是不精确的,如果使用double作为构造函数参数,也会导致BigDecimal对象不精确,比如使用浮点数0.1来构造一个BigDecimal对象,它的实际值为 0.1000000000000000055511151231257827021181583404541015625,所以,需要精确计算的场景,推荐使用String类型的构造函数。
总之,在需要精确浮点数计算的场景,不要在任何地方使用double,float类型的变量,应该使用String类型来创建BigDecimal.