如何打印所有小数点而不进行舍入?

时间:2017-01-03 06:20:33

标签: c#

我想通过从用户获取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

仍未与预期的匹配。我搜索但是我没有得到答案。如何得到预期的输出?

2 个答案:

答案 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并找出一种方法来使您的方程与之一致。

您可以通过以下几种方式解决此问题:

  1. 使用BigRational
  2. 以某种方式使用BigInteger
  3. 重新修改等式
  4. 请参阅此问题:What is the equivalent of the Java BigDecimal class in C#?,特别是此答案:https://stackoverflow.com/a/13813535/2127492
  5. 如果您使用该答案中提供的BigDecimal课程,您将能够使用BigDecimal Pow(double basis, double exponent)方法来提高计算的准确性。

    您可以使用上述课程here查看您的计算。