我们正在编写软件,对具有 8 个固定十进制数字(后面的 8 个十进制数字.
)的数字进行算术运算。
我们曾多次被内置浮点类型的有限精度所困扰double
,主要是在相等比较(在小数点后第 17 位附近失败)。所以我们尝试转向一些固定精度的十进制类型。
从它的文档来看,cpp_dec_float
应该是这样一种类型。所以我们using Decimal = double
用using Decimal = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<8>>;
如果我们从字符串实例化,一切都会正常工作Decimal
,但是当它从浮点文字实例化时会出现复杂情况:
assert(Decimal{0.001} == Decimal{"0.001"});
上面的断言失败了,因为左侧的 Decimal 实例似乎带有用于初始化它的文字的不精确表示,即使这个 epsilon 远远超出了所要求的精度 8。
有没有办法获得“在实例化时截断”行为,所以上述断言得到满足?(理想情况下,该解决方案不需要触摸发生此类实例化的所有调用站点)