Java:为什么大正数相乘会导致负结果? [复制]

2023-12-10

我看到一些用 Java 进行整数相乘的奇怪行为。我正在做一些编码练习,并发现了以下嘶嘶声类型的练习。要求:给定一个整数,编写一个函数,找出小于给定整数的每个 3 的倍数的乘积,except5 的任意倍数。例如,给定 17,我们要返回 12*9*6*3 (= 1944)。我写了以下内容:

public int findProduct(int limit) { 
    int product = 1;
    for(int n = 3; n < limit; n = n + 3) {
        if (n % 5 != 0) {
            product = product * n;
        }
    }
    return product;
}

这对于少数人来说效果很好。然而在测试中我发现一旦你达到 33 以上,返回值就相差甚远。例如,如果我调用限制为 36 的函数,它将返回 -1.466221696E9。这就是我感到困惑的地方。我正在乘法positive整数,结果在某种程度上是负数。

然而,我发现如果你声明一个双精度数,它似乎总是返回正确的结果。

public double findProduct(int limit) { 
    double product = 1;
    for(int n = 3; n < limit; n = n + 3) {
        if (n % 5 != 0) {
            product = product * n;
        }
    }
    return product;
}

我的问题是:为什么整数会发生这种情况?双精度类型有什么不同可以使其正确执行?


让我们通过一个例子来检验这一点Integer.

Integer.MAX_VALUE可以表示为01111111111111111111111111111111这是一个32位长字符串(包括符号位)。现在如果你碰巧添加1对于上面的字符串,结果是10000000000000000000000000000000这与Integer.MIN_VALUE。这称为溢出Integer.

System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));
// 1111111111111111111111111111111

根据Integer#toBinaryString:

The unsigned integer value is the argument plus 232 if the argument is negative; otherwise it is equal to the argument. This value is converted to a string of ASCII digits in binary (base 2) with no extra leading 0s.

这就是为什么你看不到符号位但看到实际值的原因Integer.MAX_VALUE is 01111111111111111111111111111111。现在看一下这段代码:

System.out.println(Integer.toBinaryString(Integer.MAX_VALUE + 1));
// 10000000000000000000000000000000
System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));
// 10000000000000000000000000000000

两个数字的输出是相同的。 Java 无法防范Integer溢出。开发商应该解决这个问题。那么这个问题的可能解决方案是什么?您可以使用其他数据类型,例如long or BigInteger。以下是您可能感兴趣的最大值:

System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Long.MAX_VALUE); // 9223372036854775807
System.out.println(Double.MAX_VALUE); // 1.7976931348623157E308
System.out.println(Float.MAX_VALUE); // 3.4028235E38

一旦Integer达到MAX_VALUE它会开始溢出,最终会得到负值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:为什么大正数相乘会导致负结果? [复制] 的相关文章

  • 如何将 JSpinner 的值设置为特定日期

    我有一个JSpinner我添加到JPanel我想将其时间设置为 GregorianCalendar calendar JSpinner spinner new JSpinner spinner setModel model pom add
  • 如何使用 Maven Failsafe 插件运行 JUnit 5 集成测试?

    当我运行命令时 Maven Failsafe 插件找不到我的 JUnit 5 集成测试mvn clean failsafe integration test 尽管它可以找到文件 我有junit jupiter api and junit j
  • 如何在log4j的配置文件中为文件附加器提供环境变量路径

    我有一个log4j xml配置文件 和一个RollingFileAppender我需要提供用于存储日志的文件路径 问题是我的代码将作为可运行的 jar 部署在 Unix 机器上 所以如果我传递这样的参数 value logs message
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • java中的单链表和双向链表?

    在java中 哪个集合接口可以有效地实现单链表和双向链表 请问代码示例吗 毫不奇怪 实现双向链表的正确接口是 LinkedList 看Java文档 http docs oracle com javase 8 docs api java ut
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • 关于Java泛型的一些问题

    假设我有以下接口和实现类 interface Foo
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • ID3和C4.5:“增益比”如何标准化“增益”?

    ID3算法使用 信息增益 度量 C4 5 使用 增益比 度量 即信息增益除以SplitInfo 然而SplitInfo对于记录在不同结果之间平均分配的分割 该值较高 否则较低 我的问题是 这如何帮助解决信息增益偏向于具有多种结果的分裂的问题
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

    有谁知道 freemarker 标签来检查 freemarker 文件中的 spring 安全角色和用户名 我从网络上的几个资源中发现以下代码将打印登录的用户名 但它没有打印用户名 而是打印 登录为
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c

随机推荐

  • For 循环不中断 (Python)

    我正在用 Python 编写一个简单的 For 循环 有没有办法在不使用 break 命令的情况下打破循环 我认为通过设置 count 10 将满足退出条件并且循环将停止 但事实似乎并非如此 注意 部分挑战是使用 FOR 循环 而不是 WH
  • 收到错误“无法添加已存在的实体”。将表的值插入数据库时​​无需过程

    我使用 Linq to sql 将记录列表插入到数据库表中 如下所示 my DataContext Class using VTMMedicalDBDataContext objVTMMedicalDBDataContext new VTM
  • Python IOError:Errno 13 权限被拒绝

    好吧 我完全困惑了 我整晚都在研究这个问题 但无法让它发挥作用 我有权查看该文件 我想做的就是阅读该死的东西 每次我尝试都会得到 Traceback most recent call last File
  • Xcode 6 对按钮图像的约束

    我正在创建一个应用程序 其仪表板包含 11 个图像 1 是背景 1 是分隔按钮的线 9 是带有图像的按钮 我尝试了几次自动约束分配 但我也尝试了手动 但我不知道如何正确设置约束 我也遵循了很多教程 如果您观看下图 您会发现按钮 图像尤其是
  • CouchDB + 凭据 + 原始通配符的 CORS 问题

    我正在尝试在 flow ch 上从 Cloudant 迁移到 Jelastic 在本地测试 离子服务 时 我收到 pouchdb 的 CORS 错误 除了我缺少的 CouchDB 之外 Jelastic 中还有其他配置吗 XMLHttpRe
  • numpy 获取许多样本而不按行替换

    我有一个非常大的清单 想象一下它看起来像这样 test llama cow horse fish sheep goat cat dog 我想多次从这个列表中抽样 我希望每个样品都被采集而不需要更换 在这种情况下我想避免 for 循环 我在
  • 使用sql计算之前的时间

    假设我有下表test它有列id time post这是它拥有的数据的样本 id time post 1 2018 06 17 16 12 30 post1 2 2018 06 17 16 13 09 post2 3 2017 06 15 1
  • 使用 gradle build 运行 tomcat jasper 任务 (jspc)

    我试图在 gradle 中使用 jspc 编译我们的 jsp 文件 但出现异常 这是相关的 gradle 部分 tomcatHome is defined in gradle properties ant tomcatHome tomcat
  • Facebook 无法在应用程序 swift 3 中打开页面

    我的网站上有一个指向我的 Facebook 的链接 该链接可在手机浏览器中打开 如果安装了应用程序 我希望它默认在 Facebook 应用程序中打开 我试图输入这段代码 但它不起作用 始终且仅通过 Safari 打开 Facebook 页面
  • 使用 SMTPLib Python 时获取未经授权的发件人地址

    我编写了一个非常简单的 Python 脚本来自动发送电子邮件 这是它的代码 import smtplib From email protected To email protected with smtplib SMTP smtp gmx
  • 测试 Hystrix 断路器配置

    我们的应用程序是通过使用 Hystrix 实现断路器模式以抗脆弱的方式编写的 整个应用程序是使用测试驱动实践创建的 但陷入了我们需要通过在方法上配置相同策略来实现断路器策略的阶段 以下是我们使用的示例配置 HystrixCommand co
  • X 轴和 Y 轴相交于 0 [重复]

    这个问题在这里已经有答案了 我使用以下代码来生成此图 x lt c 0 916 0 815 0 101 0 029 0 166 0 949 0 073 0 054 1 006 y lt c 3 91 5 17 1 08 1 28 1 01
  • LINQ Take() 反复返回相同的结果

    我想翻阅一些记录 但是Take 延伸自LINQ没有返回我预期的结果 public IQueryable
  • Grails Log4j DSL 配置中的 Log4j 过滤器

    有没有办法指定 log4j 过滤器Grails log4j DSL配置 我需要在 Grails log4j 配置中定义类似的内容
  • 如何防止 gdb 在下一个命令后停止

    我正在尝试定义一个命令链 该命令链将在 gdb 中的断点之后调用 break some function commands up next printf some string continue end 在这种情况下 例如 我想在 some
  • 将复选框添加到 PHP POST 电子邮件表单

    我正在尝试为 WordPress 构建一个表单 我过去使用过插件 但我需要对某些特定样式进行最大程度的控制 我还不太擅长 PHP 所以正在努力尝试向脚本添加复选框 我已经删除了我的尝试并将复选框留在了 html 中 但不在 PHP 中 有人
  • SQL命令插入中文字母

    我有一个数据库 其中有一列 nvarchar 类型 如果我写 INSERT INTO table VALUES 玄真 表明 在表中 我应该怎么办 我正在使用 SQL 开发人员 使用单引号而不是双引号来创建文本文字并用于NVARCHAR2 N
  • 在 for 循环中写入 .csv

    我想在 for 循环中写入 csv 文件 假设我有一个数据框data为了简单起见 有 3 行变量x 最后 我希望输出为 200 个 csv 文件 每个文件包含一行数据 数据的第一列是我的变量的标识 ID 此外 我的数据描述如下 data I
  • JavaScript通过数组中的循环设置时间差

    我尝试使用 JavaScript 中的循环将值存储在数组中 它只对我部分有效 我想将时间存储在数组中 会有startTime endTime和一个间隔 例如 如果想获取9 00到10 00之间的时间 间隔为15分钟 应该打印 09 00 0
  • Java:为什么大正数相乘会导致负结果? [复制]

    这个问题在这里已经有答案了 我看到一些用 Java 进行整数相乘的奇怪行为 我正在做一些编码练习 并发现了以下嘶嘶声类型的练习 要求 给定一个整数 编写一个函数 找出小于给定整数的每个 3 的倍数的乘积 except5 的任意倍数 例如 给