float (秒を表す) と int64 (ナノ秒を表す) の間で変換し、float から小数点以下の桁数を取得するコードがあります。6
int64_t nanos = f * 1000000000LL;
ただし、浮動小数点数に格納されている多くの 10 進数値は、2 進浮動小数点数で正確に表すことができないため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);
}
これはうまくいきますが、これを行うためのより良い、おそらくより速い方法があるかどうか疑問に思っていましたか?