最近在做一个交易机器人,处理精度问题,发现:
Float.parseFloat(String s);
BigDecimal.floatValue();
如上两个方法都会产生精度丢失问题。
那么浮点数只能用string才能精确表示吗,真蛋疼。
float和double类型不就多余了?
最近在做一个交易机器人,处理精度问题,发现:
Float.parseFloat(String s);
BigDecimal.floatValue();
如上两个方法都会产生精度丢失问题。
那么浮点数只能用string才能精确表示吗,真蛋疼。
float和double类型不就多余了?
鱼与熊掌不可兼得。
为什么设计 float 类型呢:
还有一个原因,比如:根号2,不管用什么类型,都没法精确标示出来。
float
用 4 个字节存储,double
用 8 个字节存储,精度肯定是有限的,但是一般的计算都足够了,用 float
和 double
计算比 BigDecimal
快得多。
但是难免会遇到一些需要使用高精度的浮点运算,那就用 BigDecimal
了哇。作为显示输出,当然转换成字符串是必然的。但是如果需要将 BigDecimal
的结果用于其它接口,而接口只允许使用 float
或 double
,那没办法,只能损失精度了。
15 回答8.4k 阅读
8 回答6.3k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
1 回答2.1k 阅读✓ 已解决
接@justjavac大神的答案
这
道理
从何而来?凭空想象的吧计算机存储任何数字都是基于
二进制
,那么浮点数怎么存储成二进制?这里Java遵循了IEEE754
标准,大致过程如下十进制数字转化成二进制表示形式,通过将
整数部分除2取余
、小数部分乘2取整
来完成转换转换成科学计数法(二进制下),将小数点移动到第一个1的右边
结果显而易见了,转换成IEEE754形式
当你再从2进制转换回10进制时,失去的部分就回不来了