Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数学四舍五入()不是真的四舍五入我的双打_C#_Ieee 754 - Fatal编程技术网

C# 数学四舍五入()不是真的四舍五入我的双打

C# 数学四舍五入()不是真的四舍五入我的双打,c#,ieee-754,C#,Ieee 754,我试图返回一个四舍五入到小数点后两位的双精度。我已经逐步验证了,在这一过程中的每一步,我所有的值都是双倍的。以下是我的方法: public double FindAzimuthAtPointK(LwdData pointKData, SurveyData stationOne, SurveyData stationTwo) { var deltaDepth = stationTwo.MeasuredDepth - stationOne.MeasuredDepth; var va

我试图返回一个四舍五入到小数点后两位的
双精度
。我已经逐步验证了,在这一过程中的每一步,我所有的值都是双倍的。以下是我的方法:

public double FindAzimuthAtPointK(LwdData pointKData, SurveyData stationOne, SurveyData stationTwo)
{
    var deltaDepth = stationTwo.MeasuredDepth - stationOne.MeasuredDepth;

    var valueG = FindValueG(pointKData, stationOne, stationTwo);
    var valueH = FindValueH(pointKData, stationOne, stationTwo);
    var valueY = FindValueY(stationOne, stationTwo);

    var sinStationOneInclination = Math.Sin(RadianToDegreeConversion * stationOne.Inclination);
    var sinStationTwoInclination = Math.Sin(RadianToDegreeConversion * stationTwo.Inclination);

    var sinStationOneInclinationSquared = Math.Pow(Math.Sin(RadianToDegreeConversion * stationOne.Inclination), 2);
    var sinStationTwoInclinationSquared = Math.Pow(Math.Sin(RadianToDegreeConversion * stationTwo.Inclination), 2);

    var partOneBottom = ((180 * deltaDepth) * Math.Tan(RadianToDegreeConversion * (valueG*valueY) / 2)) / (Math.PI * valueY);

    var partOneTotal = Math.Pow((valueH / partOneBottom), 2);

    var partTwo = sinStationOneInclinationSquared * sinStationTwoInclinationSquared;

    var topTotal = RadianToDegreeConversion * (partOneTotal - partTwo);

    var bottom = 2 * sinStationOneInclination * sinStationTwoInclination;

    var acosValue = Math.Acos(topTotal / bottom);

    var azimuthAtPointK = stationOne.Azimuth + acosValue;

    return Math.Round(azimuthAtPointK, 2);
}
以下是客户亲手编写的实际数学方程(和子方程):


现在,这里实际发生的是返回值是
315.579999999998
,而它应该是
315.58
。知道为什么会发生这种情况吗?

这都是关于双倍的精度和它们能准确表示的数字。如果需要绝对精度,请使用小数点,或出于显示目的在结果末尾四舍五入


要回答您关于最后四舍五入的问题,可能是315.58的结果无法准确显示为双精度到2DP。

这都是关于双精度以及它们能够准确表示的数字。如果需要绝对精度,请使用小数点,或出于显示目的在结果末尾四舍五入


要回答您关于最后四舍五入的问题,可能是315.58的结果无法准确显示为双精度到2DP。

尝试使用
十进制
类型,而不是
双精度
。这可能是double所缺乏的精度问题。实际上,它是“必须”和“是”而不是“尝试”和“可能”:-)double与其说是“双精度”,不如说是精度范围的两倍。因为它们是二进制的,所以只有2的幂才能被准确地表示。可能的问题是,你不喜欢的数字接近315.58,就像用双精度表示一样。每个计算机科学家都应该知道的关于浮点运算的知识:(从1991年开始)尝试使用
decimal
类型,而不是
double
。这可能是double所缺乏的精度问题。实际上,它是“必须”和“是”而不是“尝试”和“可能”:-)double与其说是“双精度”,不如说是精度范围的两倍。因为它们是二进制的,所以只有2的幂才能被准确地表示。可能的问题是,你不喜欢的数字接近315.58,就像用双精度表示一样。这只是使用浮点数时的一个领域。每个计算机科学家都应该知道的关于浮点数运算的知识:(从1991年开始)…或者在最后对结果进行四舍五入,就像在显示值时一样。这就是我正在做的。在显示最终结果之前,我不会对其进行舍入。请记住,该算法基于“银行家”方法,因此您认为的可能是向上舍入,而不是向下舍入。在Visual Basic(当前和.NET之前)中,从浮点数到整数的转换使用银行家舍入(舍入到偶数)。考虑到VB在财务/业务线应用程序中的使用,这是有意义的,以避免其他舍入方法累积的偏差。在编写时,在Visual Basic CInt(1.0)中,编译器发出对Math.Round(1.0)的调用,然后将该调用的结果转换为Int32…或在最后对结果进行四舍五入,就像在显示值时一样。这大概就是我正在做的。在显示最终结果之前,我不会对其进行舍入。请记住,该算法基于“银行家”方法,因此您认为的可能是向上舍入,而不是向下舍入。在Visual Basic(当前和.NET之前)中,从浮点数到整数的转换使用银行家舍入(舍入到偶数)。考虑到VB在财务/业务线应用程序中的使用,这是有意义的,以避免其他舍入方法累积的偏差。编写时,在VisualBasicCint(1.0)中,编译器发出对Math.Round(1.0)的调用,然后将该调用的结果转换为Int32。