【发布时间】:2010-12-07 23:07:03
【问题描述】:
一切都始于这些简单的代码行:
string s = "16.9";
double d = Convert.ToDouble(s);
d*=100;
结果应该是 1690.0,但不是。 d 等于 1689.9999999999998。 我想要做的就是在小数点分隔符后用 2 位数字舍入一个双精度值。 这是我的功能。
private double RoundFloat(double Value)
{
float sign = (Value < 0) ? -0.01f : 0.01f;
if (Math.Abs(Value) < 0.00001) Value = 0;
string SVal = Value.ToString();
string DecimalSeparator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
int i = SVal.IndexOf(DecimalSeparator);
if (i > 0)
{
int SRnd;
try
{
// вземи втората цифра след десетичния разделител
SRnd = Convert.ToInt32(SVal.Substring(i + 3, 1));
}
catch
{
SRnd = 0;
}
if (SVal.Length > i + 3)
SVal = SVal.Substring(0, i + 3);
//SVal += "00001";
try
{
double result = (SRnd >= 5) ? Convert.ToDouble(SVal) + sign : Convert.ToDouble(SVal);
//result = Math.Round(result, 2);
return result;
}
catch
{
return 0;
}
}
else
{
return Value;
}
但是同样的问题,从字符串转换为双精度并没有按我的意愿工作。 解决此问题的方法是将“00001”连接到字符串,然后使用 Math.Round 函数(在上面的示例中进行了注释)。
这个乘以 100(整数)的双精度值被发送到设备(收银机),这个值必须是正确的。
我正在使用 VS2005 + .NET CF 2.0
还有其他更“优雅”的解决方案吗,我对这个不太满意。
【问题讨论】:
-
又一天,另一个人在浮点上失败了:(
-
这看起来也是一个重复的问题。不知道我记得在哪里看到的。
-
这是很常见的事情,所以这个网站上肯定有几个重复的。但我认为找到它们比仅仅回答要付出更多的努力,所以很好。 :)
标签: c# .net compact-framework double type-conversion