2017-01-03 55 views
1

我想通過從用戶獲取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

使用小數而不是double來獲得更高精度 – Prabu

+0

使用小數。它正在四捨五入。我想要所有的原始小數點 –

+1

這是不可能的,它提供精度高達28-29位數。 https://msdn.microsoft.com/en-us/library/364x0z75.aspx – Prabu

回答

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位數字,如果數字只能以最高精度表示。「 MSDN

+0

@ Janne:現在O/P即將到來:wind_chill = 11.034900625509991預計的o/p:wind_chill = 11.034900625509998爲什麼預期的o/p中的最後8會在o /頁。 –

+0

@Janne:我需要將所有小數點與預期值相匹配 –

+1

您從哪裏獲得預期結果值? –

3

您可以檢查計算結果,以查看大多數表達式返回的值是否準確。問題是與System.Math.Pow(wind_speed, 0.16);的準確性。如果您查看該輸入的wolframalpha,則會提供比Math.Pow返回的1.36526100641507多得多的數字。

原因是因爲Math.pow使用浮點類型,這是設計不準確的。您也可以使用BigInteger並找出一種方法使您的方程式適用於此。

您可以通過兩種方式解決此問題:

  1. 使用BigRational
  2. 返修的公式,以某種方式使用BigInteger
  3. 看到這個問題:What is the equivalent of the Java BigDecimal class in C#?,特別是這樣的回答:https://stackoverflow.com/a/13813535/2127492

如果你確實跟着t他在該答案中提供的BigDecimal課程中,您將能夠使用方法BigDecimal Pow(double basis, double exponent)來提高計算的準確性。

你可以看到你的計算與上面的類here

相關問題