c#不舍入双精度
本文关键字:双精度 舍入 不舍 | 更新日期: 2023-09-27 18:18:37
当我将这个对象作为JSON传递回来时,它看起来像这样:
我的c#代码是:0.000000000000000 e + 000
// get adjustments for user
IEnumerable<Severity> existingSeverities =
from s in db.AdjusterPricingGrossLossSeverities
where s.type == type
&& s.adjusterID == adj.id
select new Severity
{
id = s.severity,
adjustment = Math.Round((double)s.adjustment, 2, MidpointRounding.AwayFromZero).ToString(),
isT_E = (bool)s.isTimeAndExpense
};
如何使其四舍五入到小数点后两位(0.00)?
使用;
dec.ToString("#.##");
查看此答案获取更多信息
如果在Console
应用程序中它是一个可空的双精度对象,那么
double ? d = 2.22222;
Console.WriteLine(d.Value.ToString("#.##"));
我认为你混淆了两件事。"真实的"数字不是你看到的。实数在内部以二进制格式存储。您看到的十进制数字在这种内部格式中不存在。您看到的是将该值转换为十进制表示形式的字符串。
将任何内部二进制表示转换为人类可见的字符串称为格式化。Round
函数不格式化而不格式化。请看下面的例子:
double x = 0.123456000000000e+000;
double y = Math.Round(x, 2, MidpointRounding.AwayFromZero);
// y ====> 0.120000000000000e+000;
舍入函数改变内部值。您需要的可能不是更改值,而是仅用两位数字显示未更改的值:
string formattedValue = x.ToString("N2");
如果您正在处理货币,请使用decimal
而不是double
。decimal
内部使用二进制编码的十进制格式。像1/10这样的值在计算机中不能精确地表示为二进制数,就像1/7不能精确地表示为十进制(0.142857142857…)。但是1/10在存储为decimal
时具有精确的内部表示。
原来,这是一个LINQ到SQL的问题。我这样做了,它工作了…
// get adjustments for user
IEnumerable<Severity> existingSeverities =
from s in db.AdjusterPricingGrossLossSeverities
where s.type == type
&& s.adjusterID == adj.id
select new Severity
{
id = s.severity,
adjustment = roundtest(s.adjustment.GetValueOrDefault()),
isT_E = (bool)s.isTimeAndExpense
};
// test method...
public string roundtest(double num)
{
return num.ToString("#.##");
}
试试这个:
// get adjustments for user
IEnumerable<Severity> existingSeverities =
from s in db.AdjusterPricingGrossLossSeverities
where s.type == type
&& s.adjusterID == adj.id
select new Severity
{
id = s.severity,
adjustment = s.adjustment.GetValueOrDefault().ToString("0.##"),
isT_E = (bool)s.isTimeAndExpense
};
编辑——
我认为,也许你需要有严重性类有一个属性,需要一个双精度和保存一个字符串的严重性。调整,如下所示:
Severity
{
//rest of class as normal
public double SetAdjustment
{
set { adjustment = value.ToString("0.00"); } }
}
}
-编辑,第2部分-
// get adjustments for user
IEnumerable<Severity> existingSeverities =
from s in db.AdjusterPricingGrossLossSeverities
where s.type == type
&& s.adjusterID == adj.id
select new Severity
{
id = s.severity,
SetAdjustment = s.adjustment.GetValueOrDefault(),
isT_E = (bool)s.isTimeAndExpense
};
你的代码的其余部分应该不需要改变,它应该仍然使用(严重性变量)。调整正常。这只是为了避免这样一个事实,即没有保证的方法将。net的标准数字格式字符串转换为SQL的转换,更不用说任何自定义格式了。