【问题标题】:Get DECIMAL(10,2) in C++ and show it?在 C++ 中获取 DECIMAL(10,2) 并显示它?
【发布时间】:2012-02-07 09:24:59
【问题描述】:

十进制数据格式有点问题。因此,代码如下所示:

        #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 中处理十进制数据?我需要获得准确的价值并将其展示给用户。有什么建议吗?

【问题讨论】:

    标签: c++ mysql floating-point decimal


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      但是,这些浮点类型不能存储像 12312313.95 这样的精确值。 decimal 是一种精确格式:它可以以指定的精度存储您放入其中的精确值。转换为 long double 总是会损失一些精度。
      你现在使用它们的方式,printf("%.2f") 可以正常工作(它会以正确的方式舍入),但如果你要对它们进行大量计算,最好先将它们转换为 long int (乘以 100 并四舍五入)并且仅在将它们再次存储到数据库中时才切换回长双精度数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-10
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        相关资源
        最近更新 更多