我有在浮点数(表示一秒)和 int64(表示一纳秒)之间转换的代码,从浮点数中取6
小数位
int64_t nanos = f * 1000000000LL;
然而,许多存储在浮点数中的十进制值不能完全用二进制浮点数表示,所以我得到的结果就像14199999488
我的浮点数是14.2f
. 目前我通过计算小数点后的有效位数来解决这个问题
const float logOfSecs = std::log10(f);
int precommaPlaces = 0;
if(logOfSecs > 0) {
precommaPlaces = std::ceil(logOfSecs);
}
int postcommaPlaces = 7 - precommaPlaces;
if(postcommaPlaces < 0) {
postcommaPlaces = 0;
}
然后将浮点数打印成字符串,让 Qt 正确地舍入浮点数。然后我将字符串解析为一个前后逗号整数,并用整数算术将它们相乘。
const QString valueStr = QString::number(f, 'f', postcommaPlaces);
qint64 nanos = 0;
nanos += valueStr.section(".", 0, 0).toLongLong() * 1000000000LL;
if(postcommaPlaces) {
nanos += valueStr.section(".", 1).toLongLong() *
std::pow(10.0, 9 - postcommaPlaces);
}
这工作正常,但我想知道是否有更好,也许更快的方法来做到这一点?