保留小数位数的时候出现0000000001

本文探讨了JavaScript中常见的浮点数运算误差问题,通过实例展示了0.1+0.2不等于0.3的原因,并提供了几种解决方案,包括使用Math.round()和parseFloat()结合toPrecision()来精确控制数值精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  1. // 关于js失精算法你都遇到哪些,让我们一起来细数一下吧  
  2. console.log(0.07*100); // 7.000000000000001  
  3.  
  4.   
  5. console.log(0.1+0.2); // 0.30000000000000004  
  6.   
  7.   
  8. // ........  

 

事实上,0.1 + 0.2 这这样的 0.1000000000000000055511151231257827021181583404541015625 + 0.200000000000000011102230246251565404236316680908203125 = 0.3000000000000000444089209850062616169452667236328125

这也是造成计算失精的主要原因。

 

wiki:https://en.wikipedia.org/wiki/IEEE_floating_point#Basic_formats

 

oracle失精算法专栏:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

 

解决方案:

如果是取整数,我们可以这样:

 

 

  1. Math.round((0.07*100))  

 

需要保留小数的,我们可以这样:

 

 

  1. parseFloat((0.07*100).toPrecision(12)) // = 7  
  2.   
  3.   
  4. parseFloat((0.01+0.02).toPrecision(12)) // = 0.03  
### Qt 中设置或保留小数位数的方法 在 Qt 开发中,可以通过多种方式实现浮点数的小数位数控制。以下是几种常见的方法及其具体实现: #### 使用 `QString::number` 控制小数位数 通过 `QString::number` 方法可以方便地指定浮点数的显示格式并保留特定数量的小数位数。例如: ```cpp #include <QString> #include <QDebug> double value = 32.0; QString str = QString::number(value, 'f', 2); // 设置保留两位小数 qDebug() << str; // 输出 "32.00" ``` 上述代码中的 `'f'` 参数表示固定精度模式,而第三个参数 `2` 则指定了要保留小数位数[^1]。 --- #### 使用 `QString::asprintf` 格式化字符串 如果需要更复杂的格式化操作(如添加百分号),可以使用 `QString::asprintf` 方法。此方法类似于 C 风格的 `sprintf` 函数,允许灵活定义输出格式。例如: ```cpp #include <QString> #include <QDebug> double value = 0.12345; QString formattedValue = QString::asprintf("%.2f%%", value * 100); qDebug() << formattedValue; // 输出 "12.35%" ``` 在此示例中,`%.2f` 表示保留两位小数,而 `"%%"` 转义为单个百分号字符[^2]。 --- #### 使用 QSpinBox 或 QDoubleSpinBox 的 `setDecimals` 方法 当涉及用户界面控件时,比如 `QDoubleSpinBox`,可以直接调用其 `setDecimals` 方法来设定输入框中小数部分的最大长度。例如: ```cpp #include <QDoubleSpinBox> #include <QApplication> int main(int argc, char **argv) { QApplication app(argc, argv); QDoubleSpinBox spinBox; spinBox.setRange(-1000.0, 1000.0); // 设定范围 spinBox.setValue(123.456); // 初始化值 spinBox.setDecimals(2); // 保留两位小数 spinBox.show(); return app.exec(); } ``` 这里,`spinBox.setDecimals(2)` 明确规定了该控件只支持最多两位小数的数值输入[^3]。 --- #### 总结 以上三种方法分别适用于不同的场景: - 如果仅需简单处理浮点数,则推荐使用 `QString::number`; - 若有复杂格式需求(如附加单位、特殊符号等),可选用 `QString::asprintf`; - 对于 GUI 应用程序中的交互组件配置,应优先考虑利用 `QDoubleSpinBox` 提供的功能接口完成相应调整。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Embrace924

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值