首页 / C# / c# – 具有双精度数的加法的交换属性
c# – 具有双精度数的加法的交换属性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 具有双精度数的加法的交换属性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1203字,纯文字阅读大概需要2分钟。
内容图文
![c# – 具有双精度数的加法的交换属性](/upload/InfoBanner/zyjiaocheng/817/9e2840867ab24ec39bbae88bf2dcec0a.jpg)
考虑以下单元测试:
// Works (sum 0.1 to 0.4)
float f1 = 0.1F + 0.2F + 0.3F + 0.4F;
Assert.AreEqual(1F, f1);
// Works too (sum 0.4 to 0.1)
float f2 = 0.4F + 0.3F + 0.2F + 0.1F;
Assert.AreEqual(1F, f2);
// Works (sum 0.1 to 0.4)
double d1 = 0.1D + 0.2D + 0.3D + 0.4D;
Assert.AreEqual(1D, d1);
// Fails! (sum 0.4 to 0.1)
double d2 = 0.4D + 0.3D + 0.2D + 0.1D;
Assert.AreEqual(1D, d2);
一切都按照浮动类型的预期工作(在两种情况下总和都是1),但是当使用double时,加法的交换性不受尊重.
实际上,第一个的总和是1,但是对于第二个,我得到0.99999999 …..
我明白为什么结果只有1次而不是一次(因为有些数字不能在不损失基数2的精度的情况下表示)但这并不能解释为什么它适用于浮点而不是双重…
有人可以解释一下吗?
解决方法:
float f11 = 0;
f11 += 0.1F;//0.1
f11 += 0.2F;//0.3
f11 += 0.3F;//0.6
f11 += 0.4F;//1.0
float f2 = 0.4F + 0.3F + 0.2F + 0.1F;
float f22 = 0;
f22 += 0.4F;//0.4
f22 += 0.3F;//0.700000048
f22 += 0.2F;//0.900000036
f22 += 0.1F;//1.0
添加到旁观者的答案 – 这是值查找浮点数的方式.由于精度较低(浮动数为7位,双打数为14-15),最终显示的值不同,并且意外地与您的预期相同.
但就是这样 – 这只是巧合!永远不要依赖它.浮点运算是关联的,也不是精确的.永远不要比较浮点数或使用==加倍,始终考虑使用一些保证金值.此示例适用于1,但对于其他值,它将失败.
内容总结
以上是互联网集市为您收集整理的c# – 具有双精度数的加法的交换属性全部内容,希望文章能够帮你解决c# – 具有双精度数的加法的交换属性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。