这不是 Qt 的问题,而是浮点数的内部表示问题(基于 2,而不是基于 10)。请参阅为什么不使用 Double 或 Float 来表示货币?一些好的背景信息。
如果您依赖精确值,请不要使用浮点数,而是将整数和数字的小数部分存储在单独的整数中,例如
int integ = 294;
int fraction = 4; /* assumption: one fractional digit */
然后仅将整数算术用于您的计算。
请参阅是否有库类来表示浮点数?用于此类计算的各种现有库的链接。
根据评论的反馈,我建议将字符串解析为整数和小数部分,例如:
struct Money {
int integ;
int fract;
};
Money parseMoney(const QString& input) {
QString cleanInput = input;
Money result = {0,0};
// remove group separators
QLocale locale = QLocale::system();
cleanInput.remove(locale.groupSeparator());
// convert to money
QStringList parts = cleanInput.split(locale.decimalPoint());
if (parts.count() == 1) {
result.integ = parts[0].toInt();
} else if (parts.count() == 2) {
result.integ = parts[0].toInt();
result.fract = parts[1].toInt() * 10;
} else {
// error, not a number
}
return result;
}
假设输入是一个根据当前语言环境格式化的字符串,例如,如果组分隔符是','小数点是'。并且输入字符串是“3,294.4”,Money 中的结果将是 {3294, 40}。