2015-01-15 59 views
0

我要圓得像25979.699999999997 15位值,因此它成爲25979.7並且不包含任何無意義的零。如何將十進制值舍入到一個精度,以便總數位數不超過15?

背景: 我想解析一個使用OpenXML SDK的Excel文件,並且有十進制值,如25979.7讀爲25979.699999999997。

當MS excel顯示值時,它總是將它們舍入到15位,並刪除尾隨的零,因此它變爲25979.7,但是當我使用OpenXML SDK讀取時,它不會自動執行此操作。

有什麼想法?

編輯:其實我不想修改的值,只是想顯示在該格式(作爲一個字符串)。

+0

我認爲'Double'將會有15位數字的精度另外''小數結構嚴格適用於需要準確性的財務計算,這是相對不容忍的四捨五入。「#: – MethodMan 2015-01-15 15:44:13

+1

確定你想**輪**即修改價值,或者只是**顯示**在一個很好的格式? – DrKoch 2015-01-15 15:48:19

+1

他要求總共15位數,所以25979.699999999997 - > 25979.7000000000 - > 25979.7。 – 2015-01-15 15:48:26

回答

0

簡單地格式化(未改性的)價值得到nicly格式化字符串:

double val = double.Parse("25979.699999999997"); 
string formatted = val.ToString("g"); 

g格式化會做所有的工作適合你。

+0

謝謝!這實際上有效!有一件事我仍然想要這樣做,這會使我無法在代碼中進行一些不受歡迎的更改,那樣我就可以使用Decimal值進行解析,而不是使用Double?繼回報25979.699999999997當我使用十進制: Decimal.Parse(「25979.699999999997」)的ToString(「G」) – Thunderstruck 2015-01-15 16:09:10

+0

嗯,@methodman提到,'decimal'實際上旨在保護precission,簡化:它認爲你想所有這些:...99997 – DrKoch 2015-01-15 16:11:37

+1

這隻適用於'double'具有Thunderstruck想要的大致相同精度的事實。 – Rawling 2015-01-15 16:20:35

3

那麼,你可以嘗試不那麼複雜的數學:

var x = 25979.699999999997; 
var y = Math.Round(x, 15 - (int)Math.Floor(Math.Log10(x) + 1)); 

y將完全25979.7

在這裏,我們計算的位數小數點前爲

Math.Floor(Math.Log10(x) + 1) 

和減去從15開始給我們剩餘的小數位數。

+0

它看起來像OP使用'decimal'類型,在這種情況下舍入實際上將保留尾隨零。 – Rawling 2015-01-15 15:57:26

+0

@Rawling不知道如果我理解正確的話,你 - 但我小數點可以在這裏看到的唯一的問題 - 是'Math.Log10'有'double'作爲論據的事實 - 是需要這麼醜演員,但在這個特殊的這種情況下演員不是問題。 – 2015-01-15 16:06:16

+1

在給出的例子中,舍入小數的結果是'25979.7000000000'。小數點意識到它有多精確並保留尾隨零。如果您在小數點上調用'ToString()',則默認打印這些零。 – Rawling 2015-01-15 16:21:35