当前位置: 首页 > 编程语言 > C#

除以双精度共享时C#精度损失

时间:2023-04-10 15:43:22 C#

导致C#的预期结果不完整-所以我想知道是否可能存在一些编译器标志或其他我没有想到的奇怪的东西。考虑这个例子:doublev1=0.7;双v2=0.025;双结果=v1/v2;当我在最后一行之后中断并在VS调试器中检查它时,“结果”的值为27.999999999999996。我知道我可以通过更改为“十进制”来修复它,但这在周围程序的上下文中是不可能的。像这样的两个低精度双精度值不能被分成正确的值28,这难道不奇怪吗?Math.Round的结果是唯一的解决方案吗?像这样的两个低精度双精度值不能被分成正确的值28,这难道不奇怪吗?不,不是真的。在double类型中,0.7和0.025都不能准确表示。Theexactvalues??involvedare:0.69999999999999995559107901499373838305473327636718750.025000000000000001387778780781445675529539585113525390625nowdoyouthinkthisdivisionisnotgivenexactly28pointsGarbagein,garbageout...Asyousay,thecorrectresulttorepresentadecimalnumbercorrectlyistousedecimal.如果你的程序的其余部分使用了错误的类型,那只意味着你需要解决更高的问题:得到错误答案的代价,或者改变整个程序的代价。它与双数的“简单”或“小”程度无关。严格来说,0.7和0.025都不能作为这些数字存储在计算机内存中,因此如果您对精度没问题,计算它们可能会提供有趣的结果。所以是的,使用小数或圆。打个比方:假设您以3为基数工作。在以3为基数的情况下,0.1是(十进制)1/3,即0.333333333'。因此,您可以精确地以3为基数表示1/3(十进制),但是当您尝试以十进制表示时会出现舍入错误。好吧,你可以用一些十进制数得到完全相同的结果:它们可以精确地用十进制表示,但它们不能精确地用二进制表示;因此,您会得到它们的舍入误差。如果您正在处理浮点数或双精度数,精度始终是一个问题。这是计算机科学中的一个已知问题,每种编程语言都受其影响。为了最大限度地减少这些与舍入相关的错误,我们将整个数值分析领域用于研究。例如,让我们看下面的代码。你能期待什么你会期望答案是1,但事实并非如此,你得到0.9999907。浮动v=.001f;浮点数=0;for(inti=0;i对你的第一个问题的简短回答:不,这并不奇怪。浮点数是实数的离散近似值,这意味着当你进行算术运算时,舍入误差将在你进行运算时传播和缩放。有一个整体数学领域称为数值分析,它基本上处理在使用此类近似值时如何最小化误差。这是通常的浮点不精确。并非每个数字都可以表示为双精度,并且这些次要表示不准确加起来。这就是为什么你应该'将双精度数与精确数字进行比较。我刚刚对其进行了测试,result.ToString()double.ToString()显示28(可能在double.ToString()中发生了某种舍入?)。result==28但返回false。和(int)resultreturns27.所以你只需要期待那样的不准确以上是C#学习教程:C#precisionlosswhendividedouble分享的所有内容如果对你有用还需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: