Sta*_*nov 5 .net c# double compact-framework type-conversion
一切都从这些简单的代码行开始:
string s = "16.9";
double d = Convert.ToDouble(s);
d*=100;
Run Code Online (Sandbox Code Playgroud)
结果应该是1690.0,但事实并非如此.d等于1689.9999999999998.我想要做的就是将一个double加倍到小数位分隔符后的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;
}
Run Code Online (Sandbox Code Playgroud)
但是同样的问题,从字符串转换为双字符不能正常工作.解决此问题的方法是将"00001"连接到字符串,然后使用Math.Round函数(在上面的示例中进行了注释).
此双倍值乘以100(作为整数)发送到设备(收银机),此值必须正确.
我正在使用VS2005 + .NET CF 2.0
还有另一个更"优雅"的解决方案,我对这个问题不满意.
Jor*_*ren 13
双打不能完全代表16.9.我建议你decimal改为:
string s = "16.9";
decimal m = Decimal.Parse(s) * 100;
double d = (double)m;
Run Code Online (Sandbox Code Playgroud)
您可能只想继续使用decimal而不是double,因为您说您将其用于货币目的.请记住,decimal它旨在精确地表示符合其精度的十进制数,而double仅准确表示二进制数.
| 归档时间: |
|
| 查看次数: |
18160 次 |
| 最近记录: |