首页 > 解决方案 > 将浮点数转换为十进制,错误值

问题描述

我有一个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这也是Wrong

如果我只是转换floatdouble

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");

我得到的结果是一个浮点值,所以我需要将其转换为十进制以匹配数据库中的数据类型。这就是我提出上述问题的原因。

标签: c#floating-pointtype-conversiondecimal

解决方案


我有一个浮点数:10071072872302。

float number = 10071072872302f;

不幸的是,为时已晚,float没有 10071072872302 的确切表示。所以最接近的最近机器号是:10071073357824。这就是实际存储在变量中的值。

参见例如:FloatConverter

您必须努力获得另一种表示形式,而不是floatstringdecimal或其他 bigint 库)来获得这个数字。

请注意,double 对于这个精确的数字(double number = 10071072872302floatdouble

另请参阅此通用问答:浮点数学是否损坏?


推荐阅读