【发布时间】:2020-02-28 14:15:58
【问题描述】:
我有一个float 号码:10071072872302,我需要将其转换为decimal。
float number = 10071072872302f;
var convertNumber = Convert.ToDecimal(number);
我得到了值:10071070000000 这是错误。
如果我先转换成double,再转换成decimal:
float number = 10071072872302f;
var convertNumber = Convert.ToDecimal(Convert.ToDouble(number));
我得到了值:10071073357824,这也是 错误。
如果我只是将float 转换为double:
float number = 10071072872302f;
var convertNumber = Convert.ToDouble(number);
我得到了值:10071073357824 这是错误。
我真的很困惑。我公司的数据库是用decimal数据类型设计的。我需要根据预先配置的公式以编程方式计算数据的值,我需要使用返回浮点数据类型的NCalc 库。不幸的是,我无法将float 转换为十进制`。
谁能帮我解决这个僵局?
编辑 我想澄清为什么我需要将浮点数转换为十进制数。
要获得一个值,我需要计算如下表达式:ISA16+ISA8+ISNULL(MAX((ABS(BSMS10)-ABS(BSMS10_)),0),0)
取数据库中的数据替换表达式后,我有这样一个表达式:10071072872302+872302+MAX((ABS(-072872302)-ABS(2302)),0)
为了计算这个表达式的值,我使用NCalc库
private static object CalculateString(string formula)
{
var expression = new Expression(formula);
expression.EvaluateFunction += (name, args) =>
{
switch (name)
{
case "ABS":
args.Result = Math.Abs(Convert.ToDouble(args.Parameters[0].Evaluate()));
break;
case "MAX":
args.Result = Math.Max(Convert.ToDouble(args.Parameters[0].Evaluate()), Convert.ToDouble(args.Parameters[1].Evaluate()));
break;
}
};
var value = expression.Evaluate();
return value;
}
表达式有多种形式。但是,为了检查该值,我尝试使用10071072872302 进行检查
var result = CalculateString("10071072872302");
我得到的结果是一个浮点值,所以我需要将它转换为十进制以匹配数据库中的数据类型。这就是我提出上述问题的原因。
【问题讨论】:
-
float 类型最多可以存储 7 位精度。所以你得到的是正确的。考虑 double 或 decimal。显然你会喜欢后者,使用 10071072872302m 作为文字。
-
10071072872302不能在不损失精度的情况下存储在浮点数中。 -
number.ToString("F")结果为 10071070000000.00。所以从一开始就错了。 -
其实是我从第三方得到的float值,所以需要转换成十进制。但是太难了
-
从哪里得到它并不重要。该值不适合浮点数。您不会通过转换找回丢失的精度。
标签: c# floating-point type-conversion decimal