我正在努力寻找一种更好的方法来保留十进制变量的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文件。我想知道解决这个问题的原因和方法。
非常感谢任何帮助。
提前致谢。
答案 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);