用C ++获取DECIMAL(10,2)并显示它?

时间:2012-02-07 09:25:00

标签: c++ mysql floating-point decimal

十进制数据格式有点问题。所以,代码看起来像:

        #define SHOW_MONEY                    "Money = %.2f!"
        QueryResult result = MyDatabase.PQuery("SELECT money FROM users WHERE user_id = '%u'", GetUserId());

        char str[64];

        Field *fields = result->Fetch();
        float money = fields[0].GetFloat();

        sprintf(str, SHOW_MONEY, money);
        user->ShowInformation(str, GetUserId(), true);

当字段包含12312313.95之类的值时,它显示12312314.00(值为四舍五入)而不是右值。是否有任何内置方法在mysql中使用十进制数据?我需要获得准确的值并将其显示给用户。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

float格式太小了。使用double,或者如果您的编译器支持它,long double可以获得更高的精确度。

但是,这些浮点类型无法存储精确值,如12312313.95。 decimal是一种确切的格式:它可以使用指定的精度存储您输入的确切值。转换为long double总是会失去一些精确度 您现在使用它们的方式printf("%.2f")将正常工作(它将以正确的方式进行),但如果您要对它们执行大量计算,可能最好将它们转换为{{ 1}}首先(乘以100并舍入),只有在将它们再次存储到数据库时才切换回长双精度。

答案 1 :(得分:1)

float是一种有限的数据格式,并且只能容纳如此多的信息(或std::numeric_limits<float>::digits10小数位),在您的情况下只能容纳12312314,但不能提供更多信息。

作为一种快速解决方法,您可以尝试使用double甚至是long double,但是您应该考虑您希望数字具有哪些属性。二进制浮点数甚至不能精确地表示0.1之类的数字(可以找到关于此的广泛信息here)。

由于您正在处理货币支付,使用十进制浮点库或定点库,可能是更好的选择。