c#不舍入双精度

本文关键字:双精度 舍入 不舍 | 更新日期: 2023-09-27 18:18:37

当我将这个对象作为JSON传递回来时,它看起来像这样:

0.000000000000000 e + 000

我的c#代码是:
// 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)?

c#不舍入双精度

使用;

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而不是doubledecimal内部使用二进制编码的十进制格式。像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的转换,更不用说任何自定义格式了。