我想通过从用户获取temp和wind_speed来计算wind_chill。
所有变量都声明为double
。
wind_chill = 35.74 + 0.6215 * temp + (0.4275 * temp - 35.75) * System.Math.Pow(wind_speed, 0.16);
我得到这个O / P: -
输入温度和风速:20 7 wind_chill是:11.03490062551
但我想打印所有的十进制数,直到最后一刻没有。
预期的O / P: -
wind_chill = 11.034900625509998
将变量声明为decimal
并转换decimal
中的所有值:
我得到了这个输出:
wind_chill = 11.034900625510096
仍未与预期的匹配。我搜索但是我没有得到答案。如何得到预期的输出?
答案 0 :(得分:4)
用双精度计算值。这只是.NET在打印时将值格式化为15个字符。使用R格式获取所有数字。
var wind_chill = WindChillDbl(20.0, 7.0);
Console.WriteLine(String.Format("{0:R}", wind_chill));
public static double WindChillDbl(double temp, double wind_speed)
{
return 35.74 + 0.6215 * temp + (0.4275 * temp - 35.75) * System.Math.Pow(wind_speed, 0.16);
}
"默认情况下,返回值仅包含15位精度,但内部最多保留17位数。如果此实例的值大于15位,ToString将返回PositiveInfinitySymbol或NegativeInfinitySymbol而不是预期的数字。如果您需要更高的精度,请使用" G17"指定格式。格式规范,总是返回17位精度,或者" R",如果数字可以用该精度表示,则返回15位数;如果数字只能用最大精度表示,则返回17位数。&# 34; MSDN
答案 1 :(得分:3)
您可以检查计算,以查看大多数表达式返回的值是否准确。问题在于System.Math.Pow(wind_speed, 0.16);
的准确性。如果您查看wolframalpha表示该输入,则提供的数字明显多于1.36526100641507
返回的Math.Pow
。
之所以这样,是因为Math.pow
使用的浮点类型在设计上是不准确的。您也可以使用BigInteger
并找出一种方法来使您的方程与之一致。
您可以通过以下几种方式解决此问题:
BigInteger
如果您使用该答案中提供的BigDecimal课程,您将能够使用BigDecimal Pow(double basis, double exponent)
方法来提高计算的准确性。
您可以使用上述课程here查看您的计算。