怎么用Double?在.NET中使用Math.Round的可空类型

use*_*291 2 .net c#

我想做这样的事情,但C#不接受这个:

    public static void setPrice(Double? value)
    {

        if (value != null) {
            this.TextBoxPrice.Text = Math.Round(value, 2).ToString();
        } else {
            this.TextBoxPrice.Text = "No Price";   
        }

    }
Run Code Online (Sandbox Code Playgroud)

那么它是否意味着使用可空类型Double?在这个用例中是完全没用的?那我可以用什么?

更新:我做了一个mystypo我的意思

    public static void setPrice(Double? value)
Run Code Online (Sandbox Code Playgroud)

所以我纠正了

Jon*_*eet 16

您当前没有使用可空类型 - Double是一个不可为空的值类型,因此永远不能为null.这就是你想要的:

public static void setPrice(Double? value)
{

    if (value != null) {
        this.TextBoxPrice.Text = Math.Round(value.Value, 2).ToString();
    } else {
        this.TextBoxPrice.Text = "No Price";   
    }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,您应该使用a double来表示财务价值.它不适合作为二进制浮点类型.使用decimal(或decimal?)代替.

(注意Double?相当于Nullable<Double>.)

如果你来自Java背景,你可能期望Double成为一个参考"包装"类型开始 - 它不是.在C#double中只是一个别名System.Double; 他们是同一类型.


Eri*_*ert 13

Jon的答案很好 - 特别注意关于十进制的一点 - 但我想我会补充一点,你可以使用高阶编程将"提升"方法变为可空.例如:

public static Func<T?, T?> Lift<T>(Func<T, T> func) where T : struct
{
    return (T? t)=>t.HasValue ? (T?)func(t.Value) : (T?)null;
}

public static Func<A?, R> LiftRef<A, R>(Func<A, R> func) where A : struct where R : class
{
    return (A? a)=>a.HasValue ? func(a.Value) : null;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以说:

Func<decimal, decimal> round2 = x=>Math.Round(x, 2);
Func<decimal?, decimal?> liftedRound2 = Lift(round2);
Func<decimal?, string> liftedToString = LiftRef(decimal.ToString);
...

public static void SetPrice(decimal? value)
{
    this.TextBoxPrice.Text == liftedToString(liftedRound2(value)) ?? "No Price";
} 
Run Code Online (Sandbox Code Playgroud)