Min*_*ang 1 c# floating-point decimal type-conversion
我有一个float数字:10071072872302我需要将它转换为decimal.
float number = 10071072872302f;
var convertNumber = Convert.ToDecimal(number);
Run Code Online (Sandbox Code Playgroud)
我得到了值:10071070000000这是Wrong。
如果我double先将其转换为,然后将其转换为decimal:
float number = 10071072872302f;
var convertNumber = Convert.ToDecimal(Convert.ToDouble(number));
Run Code Online (Sandbox Code Playgroud)
我得到了值:10071073357824这也是Wrong。
如果我只是转换float为double:
float number = 10071072872302f;
var convertNumber = Convert.ToDouble(number);
Run Code Online (Sandbox Code Playgroud)
我得到了值:10071073357824这是Wrong。
我真的很困惑。我公司的数据库是用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;
}
Run Code Online (Sandbox Code Playgroud)
表达式有多种形式。但是,为了检查该值,我尝试检查多个10071072872302
var result = CalculateString("10071072872302");
Run Code Online (Sandbox Code Playgroud)
我得到的结果是一个浮点值,因此我需要将其转换为十进制以匹配数据库中的数据类型。这就是我提出上述问题的原因。
我有一个浮点数:10071072872302。
float number = 10071072872302f;
不幸的是,为时已晚,float没有 10071072872302 的确切表示。因此,最接近的最近机器编号是:10071073357824。这就是实际存储在变量中的值。
参见例如:FloatConverter
你必须力争获得另一种表示,不float(string,decimal或其他BIGINT库),拿到这个号码。
请注意,double 应该是真正确定这个确切人数(double number = 10071072872302),但我不会依靠浮点数类型(float或double)存储在任何情况下的精确值。
另请参阅此通用问答:浮点数学是否已损坏?