【发布时间】:2015-07-17 08:50:40
【问题描述】:
我遇到了双精度问题。
std::stringstream ss;
ss << std::setprecision(std::numeric_limits<double>::digits10) << std::numeric_limits<double>::max();
这会将1.79769313486232e+308 打印到刺痛处,而实际上双倍最大值是1.79769313486231XXXXe+308。所以再次读取这个字符串流会导致无穷大。
如何截断数字而不是四舍五入?
【问题讨论】:
-
浮点值总是很难存储为人类可读的字符串。如果这不是强制性的,您应该考虑将浮点(或双精度)值存储为二进制 blob。或者您可以将它们转换为 uint64_t(请参阅 reinterpret_cast
(double*))以避免任何精度损失,但存储的表示形式将不适合人类阅读... -
它不能重读Double max,但应该是它附近的东西。并且字符串必须是人类可读的,因为它被放入可以手动编辑的配置文件中
-
为什么不
std::trunc? -
它向自然数截断。所以我必须添加逻辑将我的号码转换为
179769313486231.XXXX,截断它并将其转换回1.79769313486231e+308。但看起来我必须这样做...... :(
标签: c++ double std stringstream