簡體   English   中英

限制雙倍到3位小數

[英]Limiting double to 3 decimal places

這就是我想要實現的目標:

如果double有超過3個小數位,我想截斷第三個以上的任何小數位。 (不要圓。)

Eg.: 12.878999 -> 12.878

如果double小於3位小數,則保持不變

Eg.:   125   -> 125
       89.24 -> 89.24

我遇到了這個命令:

double example = 12.34567;
double output = Math.Round(example, 3);

但我不想圓。 根據上面發布的命令, 12.34567 -> 12.346

我想截斷該值,使其變為: 12.345

雙打沒有小數位 - 它們不是以十進制數字開頭的。 當截斷為三位小數時,你可以得到“與當前值最接近的兩倍”,但它仍然不會完全相同。 你最好使用decimal

話雖如此,如果只是圓角發生的方式是一個問題,你可以使用Math.Truncate(value * 1000) / 1000; 可能會做你想要的。 (你根本不需要四舍五入的聲音。)盡管如此,它仍然可能是“狡猾的”,因為結果仍然不會真正只有三個小數位。 但是,如果您使用小數值執行相同的操作,則可以使用:

decimal m = 12.878999m;
m = Math.Truncate(m * 1000m) / 1000m;
Console.WriteLine(m); // 12.878

編輯:正如LBushkin指出的那樣,你應該明確截斷顯示的目的(通常可以在格式說明符中完成)和截斷以進行進一步的計算(在這種情況下,上面應該有效)。

我無法想到在顯示目的之外明確失去精度的原因。 在這種情況下,只需使用字符串格式。

double example = 12.34567;

Console.Out.WriteLine(example.ToString("#.000"));
double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));

乘以1000然后使用截斷然后除以1000。

如果截斷數字的目的是出於顯示原因,那么只需在將double轉換為字符串時使用適當的格式。

String.Format()Console.WriteLine()等方法允許您限制格式化值的精度位數。

不建議嘗試“截斷”浮點數 - 在許多情況下,浮點數不具有精確的十進制表示。 應用一種方法,比如縮放數字,截斷它,然后將其縮小,可以很容易地將值更改為與“截斷”值的預期完全不同的值。

如果你需要一個數字的精確十進制表示,你應該使用decimal而不是doublefloat

您可以使用:

double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;

在C lang:

double truncKeepDecimalPlaces(double value, int numDecimals)
{
    int x = pow(10, numDecimals);
    return (double)trunc(value * x) / x;
}

上面的好答案 - 如果你正在尋找可重復使用的東西,那就是代碼。 請注意,您可能需要檢查小數位數值,這可能會溢出。

public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
{
    decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));

    return Math.Truncate((power * numberToTruncate)) / power;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM