我一直试图将这个打印出来的答案缩小到两位小数。所涉及的所有数学都必须保持两位小数的格式。我尝试了一些事情,我不知道要改变什么才能使这项工作成功。
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+"");
答案 0 :(得分:64)
string.Format
不会更改原始值,但会返回格式化字符串。例如:
Console.WriteLine("Earnings this week: {0:0.00}", answer);
注意:Console.WriteLine
允许内联字符串格式化。以上相当于:
Console.WriteLine("Earnings this week: " + string.Format("{0:0.00}", answer));
答案 1 :(得分:58)
那么,根据您的需要,您可以选择以下任何一项。 Out put是针对每种方法编写的
您可以选择所需的
这将围绕
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
答案 2 :(得分:11)
您可以将double
四舍五入到两位小数:
double c;
c = Math.Round(c, 2);
但要注意四舍五入最终会咬你,所以谨慎使用它。
而是使用decimal
数据类型。
答案 3 :(得分:8)
我会推荐定点(“F”)格式说明符(如Ehsan所述)。请参阅Standard Numeric Format Strings。
使用此选项,您甚至可以设置可配置的小数位数:
public string ValueAsString(double value, int decimalPlaces)
{
return value.ToString($"F{decimalPlaces}");
}
答案 4 :(得分:2)
由于你在使用货币,为什么不这样做呢:
Console.Writeline("Earnings this week: {0:c}", answer);
这会将答案格式化为货币,因此在我的机器(英国)上它将显示为:
本周收益:£209.00
答案 5 :(得分:0)
问题是,当您对所有带有两位小数的数字进行加法和乘法运算时,您希望不会出现舍入错误,但是请记住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 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));
}
答案 6 :(得分:0)
double d = 3.1493745;
string s = $"{d:0.00}"; // or $"{d:#.##}"
Console.WriteLine(s); // Displays 3.15