开发者社区> 问答> 正文

java浮点数精度问题

最近在做一个交易机器人,处理精度问题,发现:
Float.parseFloat(String s);
BigDecimal.floatValue();
如上两个方法都会产生精度丢失问题。那么浮点数只能用string才能精确表示吗。float和double类型不就多余了?

展开
收起
蛮大人123 2016-02-28 16:44:54 2415 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    计算机存储任何数字都是基于二进制,那么浮点数怎么存储成二进制?这里Java遵循了IEEE754标准,大致过程如下
    十进制数字转化成二进制表示形式,通过将整数部分除2取余、小数部分乘2取整来完成转换
    0.12 => 0.00011110101110000101000111101...
    // 发现了么? 十进制的有穷小数,在二进制中,变成了无穷
    // 只有 小数部分 * 2^n == 1 的情况,用二进制表示才是有穷的
    转换成科学计数法(二进制下),将小数点移动到第一个1的右边
    0.00011110101110000101000111101... => 1.1110101110000101000111101... * 2 ^ -4
    结果显而易见了,转换成IEEE754形式
    1 8位 23位 存不下了
    0 01111011 11101011100001010001111 (01...)

    • 2的-4次幂 除去整数部分1之后剩余的尾数 0舍1入后忽略这部分,精度就这样没了
      当你再从2进制转换回10进制时,失去的部分就回不来了

    全选复制放进笔记
    1 . 1 1 1 0 . ... . 1 (?...)
    1 2^0 + 1 2^-1 + 1 2^-2 + 1 2^-3 + 0 2^-1 + ... + 1 2^-23 + ???

    2019-07-17 18:49:47
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载