十进制数据格式有点问题。所以,代码看起来像:
#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中使用十进制数据?我需要获得准确的值并将其显示给用户。有什么建议吗?
答案 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)。
由于您正在处理货币支付,使用十进制浮点库或定点库,可能是更好的选择。