c# 取余数 浮点数_浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

本文深入探讨了浮点数精度问题,特别是在JavaScript和C#中的表现。通过分析IEEE-745浮点数表示法,揭示了0.1加0.2不等于0.3的原因,这是由于浮点数在二进制表示时的精度损失。文章介绍了浮点数的存储结构、范围和精度,指出JavaScript的Number类型能精确计算的整数范围,并提出了使用大整数或特定库(如Java的BigDecimal)来解决浮点数计算的精度问题。
摘要由CSDN通过智能技术生成

在知乎上上看到如下问题:

浮点数精度问题的前世今生?

1.该问题出现的原因 ?

2.为何其他编程语言,比如java中可能没有js那么明显

3.大家在项目中踩过浮点数精度的坑?

4.最后采用哪些方案规避这个问题的?

5.为何采用改方案?

例如在 chrome js console 中:alert(0.7+0.1); //输出0.7999999999999999

之前自己答的不是满意(对 陈嘉栋的回答 还是满意的),想对这个问题做个深入浅出的总结

再看到这几篇长文《[ JS 基础 ] JS 浮点数四则运算精度丢失问题 (3)》、《JavaScript数字精度丢失问题总结》、《细说 JavaScript 七种数据类型》,略有所悟,整理如下:

这个问题并不只是在Javascript中才会出现,任何使用二进制浮点数的编程语言都会有这个问题,只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。

c4dd556c084bc5b48a374810d6875dfa.png

511c5d25b303c1e5ee51ca0389f47042.png

浮点数丢失产生原因

JavaScript 中的数字类型只有 Number 一种,Number 类型采用 IEEE754 标准中的 “双精度浮点数” 来表示一个数字,不区分整数和浮点数 (js位运算或许是为了提升B格)。

几乎所有的编程语言浮点数都是都采用IEEE浮点数算术标准。java float 32 浮点数: 1bit符号 8bit指数部分 23bit尾数。推荐阅读《JAVA 浮点数的范围和精度》

什么是IEEE-745浮点数表示法

IEEE-745浮点数表示法是一种可以精确地表示分数的二进制示法,比如1/2,1/8,1/1024

十进制小数如何表示为转为二进制

十进制整数转二进制

十进制整数换成二进制一般都会:1=>1 2=>10 3=>101 4=>100 5=>101 6=>110

6/2=3…0

3/2=1…1

1/2=0…1

倒过来就是110

十进制小数转二进制

0.25的二进制

0.25*2=0.5 取整是0

0.5*2=1.0 取整是1

即0.25的二进制为 0.01 ( 第一次所得到为最高位,最后一次得到为最低位)

0.8125的二进制

0.8125*2=1.625 取整是1

0.625*2=1.25 取整是1

0.25*2=0.5 取整是0

0.5*2=1.0 取整是1<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值