”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如果需要准确答案,请避免浮动和双精度

如果需要准确答案,请避免浮动和双精度

发布于2024-11-06
浏览:550

Item  Evite o float e o double caso sejam necessárias respostas exatas

float 和 double 问题:

  • 专为科学和数学计算而设计,执行二进制浮点运算。
  • 不适合货币计算或需要精确答案的情况。
  • 无法准确表示10的负次方,例如0.1,从而导致错误。

示例1:
减去美元金额时计算错误:

System.out.println(1.03 - 0.42);  // Resultado: 0.6100000000000001

示例2:
以每件 10 美分的价格购买 9 件商品时出错:

System.out.println(1.00 - 9 * 0.10);  // Resultado: 0.09999999999999998

即使四舍五入,错误仍然存​​在。
累进计算存在问题,例如以 0.10 到 1.00 的增量价格购买糖果时。

示例3:
买糖果时出错,直到你没钱了:

double funds = 1.00;
for (double price = 0.10; funds >= price; price  = 0.10) {
    funds -= price;
}
System.out.println(funds);  // Resultado: 0.3999999999999999

解决方案1:使用BigDecimal

  • 非常适合财务计算和精度至关重要的情况。
  • 避免使用 BigDecimal 的双构造函数,首选 String 构造函数。

BigDecimal 示例:

BigDecimal funds = new BigDecimal("1.00");
BigDecimal price = new BigDecimal("0.10");
int itemsBought = 0;

while (funds.compareTo(price) >= 0) {
    funds = funds.subtract(price);
    price = price.add(new BigDecimal("0.10"));
    itemsBought  ;
}
System.out.println(itemsBought   " items bought. Money left: "   funds);  
// Resultado: 4 items bought. Money left: 0.00

计算现在很精确。

BigDecimal的缺点:

  • 使用起来不如原始类型方便。
  • 速度较慢,尤其是对于大量操作。

解决方案2:使用int或long

  • 为了避免精度问题,请使用 int 或 long 而不是以 double 表示的美元,以美分为单位进行计算。

int 示例(以分为单位):

int funds = 100;  // 1.00 dólar = 100 centavos
int price = 10;   // 0.10 dólar = 10 centavos
int itemsBought = 0;

while (funds >= price) {
    funds -= price;
    price  = 10;
    itemsBought  ;
}
System.out.println(itemsBought   " items bought. Money left: "   funds);  
// Resultado: 4 items bought. Money left: 0

计算又快又准。

结论:

  • 不要使用 float 或 double 进行需要精确精度的计算。
  • 使用 BigDecimal 进行货币计算或需要小数精度的情况。
  • 使用 int 或 long 进行不涉及大数的金融计算,以分为单位进行计算。

选择:

  • 对于最多 9 位数字,请使用 int。
  • 对于最多 18 位数字,请使用 long。
  • 对于较大数量,请使用 BigDecimal。
  • 此摘要表明,根据上下文,在 BigDecimal、int 或 long 之间进行选择可以优化精度和性能。
版本声明 本文转载于:https://dev.to/giselecoder/item-60-evite-o-float-e-o-double-caso-sejam-necessarias-respostas-exatas-3mep?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    Accessing Actual Rendered Font when Undefined in CSSWhen accessing the font properties of an element, the JavaScript object.style.fontFamily and objec...
    编程 发布于2025-04-30
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-04-30
  • 在Python中如何检测字符串中的特定字符?
    在Python中如何检测字符串中的特定字符?
    在使用字符串工作时检测字符串的特定字符的特定字符,检查其内容是必不可少的。其中一个方面涉及验证字符串是否包含特定字符。在Python 2中,有多种完成此任务的方法。方法1:在运算符 如果在s::$”中使用。 #做一些方法2:使用find()方法另一个选项是find()方法。如果在字符串中找...
    编程 发布于2025-04-30
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-04-30
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-30
  • Java HashSet去重邮箱地址的终极指南
    Java HashSet去重邮箱地址的终极指南
    在java 中,您的目标是从存储在文件中的一系列地址中删除重复的电子邮件。您可以使用设置数据结构来实现此目的: 在提供的代码,数组,中用于存储电子邮件。但是,要消除重复项,您可以利用 class。 hashset是一个唯一元素的集合。当您将元素添加到已经存在的标签时,它不会再次添加。此属性使其非...
    编程 发布于2025-04-30
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-04-30
  • Go pprof输出为何损坏,尽管应用正常运行?
    Go pprof输出为何损坏,尽管应用正常运行?
    在使用“ PPROF”工具进行prof for prof 此问题的原因通常位于命令语法中,以调用“ pprof”。具体来说,命令需要将二进制的路径介绍为第二个参数,在某些情况下可能缺少二进制的参数。 解决问题,请确保二进制路径包含在命令中。正确的语法应该看起来像这样:[&& && && && pp...
    编程 发布于2025-04-30
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-30
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-30
  • 解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    mysql错误1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的数据包,用于面对阴谋mysql错误1153,同时导入数据capase doft a Database dust?让我们深入研究罪魁祸首并探索解决方案以纠正此问题。理解错误此错误表明在导入过程中接...
    编程 发布于2025-04-30
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-04-30
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-04-30
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-04-30
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-30

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3