当前位置: 首页 > article >正文

一个以细节见功底的JAVA程序

现在需要计算一个平方和的公式:

\sum_{j=1}^{n}j^2 = \frac{n(n+1)(2n+1)}{6}

根据公式写出了下面的程序,请问:(1)这个程序是否有问题?

public class CaclTest{

    public void test1(int n){
        double sum = (n* (n+1)*(2*n+1)) / 6;
        System.out.println("sum:" + sum)
    }

    public static void main(String[] args){
        CaclTest ct = new CaclTest();
        ct.test1(100);
    }

}

(2)当n=100000时,上面的程序是否还能计算出正确结果?

(3)如果修改一下计算程序,下面哪个式子正确:

a. double sum = (n* (n+1)*(2*n+1)) / 6.0;

b. double sum = (n* (n+1.0)*(2*n+1)) / 6;

c. double sum = (n* (n+1)*(2.0*n+1)) / 6;

d. double sum = (n* (n+)*(2*n+1.0)) / 6;

利用原理:在Java中,整型与双精度数相乘会发生数据类型提升(demotion),这意味着整型会自动转换为双精度数进行计算。这个过程不会导致数值上的丢失,因为双精度数可以精确地表示整型的所有值。

也就是说 整型 x 双精度型,整型会转换为2个双精度数相乘;整型 x 整型 结果仍然为整型,可能会溢出,导致结果不正确。

现在回答上面的问题:

(1)当n=100时,这个程序没有问题,可以正常算出结果。

(2)当n=100000时,这个程序不能计算出正确结果。

(3)正确的写法只有b。其他几个为什么不正确呢:

a. 整型x整型,100000*100000=1e10, 而Java语言中Integer型最大值只有:2147483647(2^31-1),结果会溢出,发生溢出后,后面计算的结果都不会对了。

c. 仍然是int * int,再乘double型,会发生溢出。

d. 与a,c 类似。

只有b选项是int * double,这时会发生数据类型提升,整型会转换为双精度计算;接着第2步double * int,发生数据类型提升;最后一步double / int  发生数据类型提升,所以结果正确。


http://www.kler.cn/a/301895.html

相关文章:

  • 如何在 Ubuntu 上配置 Kotlin 应用环境 ?
  • JavaScript:浏览器对象模型BOM
  • 我的第一个PyQt5程序
  • 基于Matlab的碎纸片的自动拼接复原技术
  • C#界面设计
  • 「Mac玩转仓颉内测版5」入门篇5 - Cangjie控制结构(上)
  • MySQL——数据库的高级操作(二)用户管理(2)创建普通用户
  • 春招审核新策略:Spring Boot系统实现
  • 大型语言模型:通过代码生成、调试和 CI/CD 集成改变软件开发的游戏规则
  • 大数据新视界 --大数据大厂之Flink强势崛起:大数据新视界的璀璨明珠
  • Stable Diffusion绘画 | ControlNet应用-Tile(分块)—tile_resample(分块-重采样)
  • asio中的异步accept分析
  • 如何将 Electron 项目上架 Apple Store
  • 【时时三省】c语言例题----华为机试题<进制转换>
  • Android-10分区存储介绍及百度APP适配实践(1)
  • google vr 入门之制作简易的VR播放器(二)
  • 基于OpenCV与MQTT的停车场车牌识别系统:结合SQLite和Flask的设计流程
  • 基于Qt的自定制WPS
  • 垃圾回收
  • Flutter集成Firebase中的Realtime Analytics
  • 初学者指南:MyBatis 入门教程
  • 【开源免费】基于SpringBoot+Vue.JS房产销售系统(JAVA毕业设计)
  • Redis Key的过期策略
  • 18 Python如何操作文件?
  • docker和docker-compose安装脚本
  • Ajax 揭秘:异步 Web 交互的艺术