将双精度设置为小数点后两位

本文关键字:两位 双精度 设置 小数点 | 更新日期: 2023-09-27 18:28:57

我一直在努力让这个答案打印到小数点后两位。所有涉及的数学都必须保持小数点后两位的格式。我已经尝试了一些事情,但我不确定该改变什么才能让它发挥作用。

double pdt1 = 239.99;
double pdt1Total;
double pdt2 = 129.75;
double pdt2Total;
double pdt3 = 99.95;
double pdt3Total;
double pdt4 = 350.89;
double pdt4Total;
double wage = 200;
double percentage = 9;
double total;
double answer;
double i = 100;
double a;
double b;
double c;
double d;

Console.Write("Enter number sold of product #1: ");
a = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number sold of product #2: ");
b = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number sold of product #3: ");
c = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number sold of product #4: ");
d = Convert.ToInt32(Console.ReadLine());

pdt1Total = a * pdt1;
pdt2Total = b * pdt2;
pdt3Total = c * pdt3;
pdt4Total = d * pdt4;
total = (pdt1Total + pdt2Total + pdt3Total + pdt4Total);

string.Format("{0:0.00}", total);
string.Format("{0:0.00}", answer = (total * percentage / i) + wage);

Console.WriteLine("Earnings this week: "+answer+"");

将双精度设置为小数点后两位

string.Format不会更改原始值,但会返回一个格式化的字符串。例如:

Console.WriteLine("Earnings this week: {0:0.00}", answer);

注意:Console.WriteLine允许内联字符串格式化。以上相当于:

Console.WriteLine("Earnings this week: " + string.Format("{0:0.00}", answer));

根据您的需要,您可以选择以下任意一种。输出针对每种方法

你可以选择你需要的

这将绕过

decimal d = 2.5789m;
Console.WriteLine(d.ToString("#.##")); // 2.58

这将确保写入小数点后2位。

d = 2.5m;
Console.WriteLine(d.ToString("F")); //2.50

如果你想写逗号,你可以使用这个

d=23545789.5432m;
Console.WriteLine(d.ToString("n2")); //23,545,789.54

如果你想返回四舍五入的十进制值,你可以这样做

d = 2.578m;
d = decimal.Round(d, 2, MidpointRounding.AwayFromZero); //2.58

您可以将double四舍五入到两位小数,如下所示:

double c;
c = Math.Round(c, 2);

但要小心,四舍五入最终会咬到你,所以要小心使用。

而是使用decimal数据类型。

我建议使用不动点("F")格式说明符(正如Ehsan所提到的)。请参见标准数字格式字符串。

有了这个选项,你甚至可以有一个可配置的小数位数:

public string ValueAsString(double value, int decimalPlaces)
{
    return value.ToString($"F{decimalPlaces}");
}
    double d =  3.1493745;
    string s = $"{d:0.00}"; // or $"{d:#.##}"
    Console.WriteLine(s); // Displays 3.15

既然你在用货币工作,为什么不简单地这样做呢:

Console.Writeline("Earnings this week: {0:c}", answer);

这将把答案格式化为货币,所以在我的机器(英国)上,它将显示为:

本周收益:209.00英镑

问题是,当你对所有小数点后两位的数字进行加法和乘法运算时,你希望不会出现舍入错误,但请记住,double的内部表示是以2为基数,而不是以10为基数!因此,以10为基数的0.1这样的数字可能以2为基数:0.101010101010110011…具有无穷多的小数(存储在双精度中的值将是一个数字N,带有:

 0.1-Math.Pow(2,-64) < N < 0.1+Math.Pow(2,-64) 

因此,由于舍入误差,类似12.3+0.1的运算可能与12.4不完全相同的64位双倍值(或者12.456*10可能与124.56不相同)。例如,如果您在数据库中将12.3+0.1的结果存储到双精度数字类型的表/列字段中,然后SELECT WHERE xx=12.4,您可能会意识到您存储的数字并不完全是12.4,Sql SELECT不会返回记录;因此,如果不能使用十进制数据类型(其内部表示形式以10为基数),而必须使用"double"数据类型,则必须在每次加法或乘法后进行一些规范化:

double freqMHz= freqkHz.MulRound(0.001); // freqkHz*0.001
double amountEuro= amountEuro.AddRound(delta); // amountEuro+delta

    public static double AddRound(this double d,double val)
    {
        return double.Parse(string.Format("{0:g14}", d+val));
    }
    public static double MulRound(this double d,double val)
    {
        return double.Parse(string.Format("{0:g14}", d*val));
    }

如果想要0.5而不是.5,请使用d.ToString("0.##")