1

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

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

第一步: SQL查询

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

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

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

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

Step2: 通过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

4 回答 4

2

小数点右侧的尾随零不是精度。
这只是介绍。

decimal d;
d = 10;
System.Diagnostics.Debug.WriteLine(string.Format("{0:N2}",d));
于 2013-08-01T12:21:11.000 回答
1

您可以使用

decimal.Round(value,decimalPoints);

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

于 2013-08-01T13:45:10.980 回答
0

您将精度与表示混淆了。您在 SSMS 中看到的是一个格式化的数字(字符串)。您在 C# 中(以及在 DB 中)所拥有的是一个“真实”数字。在真正的正常结尾的小数点后 0 不包括在内。

如果你想格式化它,你可以做类似的事情NET_TOTAL.ToString("0.00")

请注意,可能还有另一个问题:

NET_TOTAL = 1.245;

decimal sum = NET_TOTAL + NET_TOTAL;

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

于 2013-08-01T09:23:39.113 回答
-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);

于 2013-08-01T09:23:53.293 回答