如何保持2位数的精度

时间:2013-08-01 09:16:55

标签: c# .net decimal precision dapper

我正在努力寻找一种更好的方法来保留十进制变量的2位精度。

在这里,我将问题分为两个步骤:

第1步: SQL查询

为了在SQL查询中获得2位数的精度,我正在使用

CONVERT(DECIMAL(10,2), .....) // to get 2 digit precision

执行时,我能够在SSMS中实现2位精度。

NET_TOTAL  
---------    
10.00  
12.50  
14.25

第2步: 通过C#代码

在我的C#代码中,当我尝试将值存储在我的C#代码中时,它不保留2位精度。

NET_TOTAL  
---------    
10       //lost my precision
12.5     //lost my precision
14.25

以下是我的变量声明。

public decimal? NET_TOTAL { get; set; } 

但我可以尝试使用属性解决方法,但我无法得到它。

我正在使用

  • 用于数据库操作。
  • FileHelper.dll ,用于将查询列表转换为CSV文件。

我想知道解决这个问题的原因和方法。

非常感谢任何帮助。

提前致谢。

4 个答案:

答案 0 :(得分:2)

小数点右侧的尾随零不精确 这只是演示。

decimal d;
d = 10;
System.Diagnostics.Debug.WriteLine(string.Format("{0:N2}",d));

答案 1 :(得分:1)

您可以使用

decimal.Round(value,decimalPoints);

这将返回一个小数四舍五入到decimalPoints。

答案 2 :(得分:0)

您将精确度与表现混淆。您在SSMS中看到的是格式化的数字(字符串)。你在C#(和数据库内部)中拥有的是一个“真实”的数字。在小数点后的真正正常结束0不包括在内。

如果要格式化,可以执行NET_TOTAL.ToString("0.00")

之类的操作

请注意,可能还有其他问题:

NET_TOTAL = 1.245;

decimal sum = NET_TOTAL + NET_TOTAL;

sum将是2.29,但是在到NET NET_TOTAL的往返之后将是1.24或1.25(取决于DB如何舍入1.245)并且重新计算的总和将是2.28或2.3。

答案 3 :(得分:-1)

这是可以接受的:

    private decimal? _netTotal;
    public decimal? NET_TOTAL{
        get{
            return _netTotal;
        }
        set
        {
            if (value.HasValue)
            {
                _netTotal = Math.Truncate(value.Value, 2); // or rounding
            }else{
                _netTotal = value;
            }
        }
    }

如果你想保留原始值但是用2位小数表示,那么你可以修改getter:return Math.Truncate(value.Value,2);