首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果这里的输出是“不相等的”,那么为什么用double而不是float不能给出相同的输出呢?

这个问题涉及到浮点数的精度问题。在计算机中,浮点数的表示是有限的,无法精确地表示所有的实数。float和double都是浮点数类型,但它们的精度不同。

float是单精度浮点数,占用4个字节,能够表示的有效位数大约是7位。而double是双精度浮点数,占用8个字节,能够表示的有效位数大约是15位。

由于浮点数的精度有限,当进行浮点数运算时,可能会出现舍入误差。这意味着即使两个浮点数在数学上是相等的,但在计算机中表示时可能会有微小的差异,导致比较结果为不相等。

因此,如果要求精度较高的计算,尤其是涉及到小数点后多位的计算,建议使用double类型而不是float类型。double类型的精度更高,能够提供更准确的计算结果。

在云计算领域中,如果需要进行精确的数值计算,例如金融领域的计算或科学计算,可以使用double类型来确保计算结果的准确性。

腾讯云提供了多种云计算服务,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据具体需求进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

String类和常量池内存分析例子以及8种基本类型

如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。...根据《java虚拟机规范 Java SE 8版》记录,如果某String实例所包含的Unicode码点序列与CONSTANT——String_info结构所给出的序列相同,而之前又曾在该实例上面调用过String.intern...(结论是常量池有equals相同的串或者引用指向equals相同的串就不再缓存) 第六句,str3.intern(); 去检查一下常量池到底有没有”str01″呢?...检查发现常量池有个引用指向堆中的”str01″,JVM认为常量池是有”str01″的,那么直接返回指向堆中的”str01″地址,很可惜,没有变量去接收,这一句在这里没有什么用。...、Double,其他基本类型的包装类都有对应的对象常量池缓存(就是cache数组缓存-128~127),Float、Double不管自动还是手动装箱,一定不相等,里面都是调用构造new出来的,比较2块堆内存

24220

第9条 覆盖equals时总要覆盖hashCode

(即equals相等,那么hashCode一定相等,需要注意的是,反过来不一定成立,即hashCode相等不代表equals相等) 如果两个对象根据equals方法比较是不相等的,那么调用这两个对象中任意一个对象的...正如之前提到的,hashCode其实主要用于跟基于散列的集合合作 如HashMap会把相同的hashCode的对象放在同一个散列桶(hash bucket)中,那么即使equals相同而hashCode...不相等,那么跟HashMap一起使用,则会得到与预期不相同的结果....相同,即equals会为true System.out.println(className); } className的值为多少呢?...那么问题来了,如何去重写hashCode呢?返回一个固定值?比如1?NO!!! So,how? EJ给出的解决办法: 把某个非零的常数值,比如17,保存在一个名为result的int类型的变量中。

1.1K20
  • 《Java从入门到失业》第五章:继承与多态(5.8-5.10):多态与Object类

    这里需要注意一个问题,就是构造方法是不能被重写的,因为构造方法不能被继承。另外子类的方法不能低于超类方法的可见性。       ...这种在运行时能够自动选择调用哪个方法的现象称为动态绑定(dynamic binding)。 5.8.3多态有什么用        我们了解了方法重写和动态绑定,那么多态有什么用处呢?...例如对于String类来说,如果仅仅判断对象引用是否相等,那么“Java大失叔”和“Java大失叔”很有可能将不相等。更有意义的判断可能是两个对象的状态完全一致(即所有属性值都一致)。...检测otherObj是否为null,如果是直接返回false。 比较this和otherObj是否属于同一个类;这里要仔细思考一下是使用getClass方法还是instanceof。...如果对象x和y是不同的对象,那么x.hashCode()和y.hashCode()基本是不相同的。

    46640

    Java基础中的面试题(一),你能接几招(附答案(不带答案的面试题都是耍流氓))

    byte(1字节) , short(2字节) ,int(4字节), long(8字节),float(4字节) , double(8字节), boolean(1字节), char(2字节) 给出下列程序的输出结果...小数的默认类型是double, 所以像18.5 和 12.3其实都是double类型的, 把double类型赋值给float 是有问题的,因为有可能装不下。 所以第一种写法错误,第二种写法正确。...如果没有重写equals方法,那么调用的时候相当于都是在调用父类Object中的equals方法, Object类中的equals就是使用 == 实现的。==在连接基本数据类型的时候,比较的是值。...equals: 判断对象是不是同一个对象。默认的equals是== 也就是比较地址值。我们可以重写equals方法。 两个方法都可以用来比较对象是否相同。...所以一般我们比较的时候,一般先比较hashCode是否相等,如果hashCode不相等,说明肯定不是同一个对象,如果hashCode相等,也不能代表是同一个对象,因为上面说了存在一些极端情况,所以在使用

    21510

    详解:Java的重载方法与示例

    方法重载是一项功能,如果一个类的参数列表不同,则它允许一个类拥有多个具有相同名称的方法。它类似于Java中的构造函数重载,它允许一个类具有多个具有不同参数列表的构造函数。...例如: add(int, float) add(float, int) 方法重载的无效情况: 当我说参数列表时,我不是在说方法的返回类型,例如,如果两个方法具有相同的名称,相同的参数并且具有不同的返回类型...,那么这不是有效的方法重载示例。...第一种方法的参数列表为(char,int),第二种方法的参数为(int,char)。由于顺序不同,因此该方法可以重载而不会出现任何问题。...有效的重载情况。这里的参数数量是不同的。

    70510

    为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?

    很多人都知道,在进行金额表示、金额计算等场景,不能使用double、float等类型,而是要使用对精度支持的更好的BigDecimal。... 到这里,我们大概解释清楚了,之所以equals比较bigDecimal4和bigDecimal5的结果是false,是因为精度不同。 那么,为什么精度不同呢?...为什么精度不同 这个就涉及到BigDecimal的精度问题了,这个问题其实是比较复杂的,由于不是本文的重点,这里面就简单介绍一下吧。大家感兴趣的话,后面单独讲。...所以,当我们使用equals方法判断判断两个数是否相等的时候,是极其严格的。 那么,如果我们只想判断两个BigDecimal的值是否相等,那么该如何判断呢?...但是,他的equals方法使用的时候需要谨慎,因为他在比较的时候,不仅比较两个数字的值,还会比较他们的精度,只要这两个因素有一个是不相等的,那么结果也是false、 如果读者想要对两个BigDecimal

    86930

    数字的陷阱

    1、浮点数运算 先来看一个对浮点数作运算的例子,请问会输出什么: System.out.println(4.015*100); 结果可能会让你大跌眼镜,不是401.5,而是401.49999999999994...,这就要涉及到浮点数的一些知识点,Java中,浮点类型是依据IEEE754标准,IEEE754定义了32位和64位双精度两种浮点二进制小数标准,而采用二进制表示double,float浮点数是不准确的(...这个构造器BigDecimal(double val)的结果是不可预知的,这里,0.1无法准确地表示为 double类型(一个有限长度的二进制小数),传入到构造方法的参数值并不完全等于 0.1。...,如果你研究过java中RoundingMode,你就会猜到它默认使用的是RoundingMode.HALF_EVEN,即如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP..."); } //a与b不相等 由于a,b指向的是不同的实例,最后比较结果是不相等,这和我们期望的比较结果往往是不同的,如果把赋值为null,程序便会报错。

    79180

    程序员C语言快速上手——基础篇(二)

    以上表中,long类型有两种情况,使用32位编译器编译,则long为4字节,占32位,如果使用64位编译器,则long为8字节,占64位二进制。当然这个也不是绝对的,仍然与系统环境有关。...基本数据类型的打印 在第一个示例中,我们已经使用printf函数打印了hello world,这里print是打印的意思,那么f是什么意思呢?其实这里的f是缩写,是format的意思,代表格式化打印。...前面已经说过,在不同的硬键平台上,不同的编译器下,这些类型的实际长度可能都有出入,那么如何才能确切的指定当前某个数据类型的实际长度到底是多少呢?...size = %d\n",sizeof(float)); 9 printf("double size = %d\n",sizeof(double)); 10 } 输出: 1 int size...常量 C语言中使用const关键字修饰的就是常量,常量是不能修改的。

    1K30

    Integer 128 == 128,true?

    如果不了解Integer的特性,或许会认为输出结果为:ture,然而实际上输出结果是:false。 第2题....Java是一种面向对象的语言,Java中的数据基本都是以对象的形式存在的,但是为了方便,Java提供了八种基本数据类型,它们分别是:int、byte、short、long、float、double、boolean...、char,这八种基本数据类型的数据不是以对象的形式存在的,基本数据类型的变量都是直接存储的值而不是对象的引用。...为了符合Java是一种面向对象的语言,Java分别为这八种数据类型提供了对应的包装类型,分别为:Integer、Byte、Short、Long、Float、Double、Boolean、Char。...而第1题中,由于128不在-127~127之间,因而,a和b各自指向了new出的新对象,那么a和b的地址当然不相等了。有一点需要了解的是,通过new关键字实例化的对象,对象的地址一定是不同的!

    1.1K20

    打破你的认知,java,除以0一定会崩溃吗?

    System.out.println("1/0=" + 1/0); 大叔的灵魂拷问: 上面的代码会崩溃吗?如果不会,会输出什么呢? 上面的代码会崩溃吗?如果不会,会输出什么呢? 上面的代码会崩溃吗?...如果不会,会输出什么呢? 会崩溃吗?如果不会,会输出什么呢? 会崩溃吗?如果不会,会输出什么呢? 输出日志: ? 为什么浮点数除以0不会崩溃?...我们先说结论: 因为java的float和double使用了 IEEE 754 标准。 这个标准规定:浮点数除以0等于正无穷或负无穷。 Double类的定义 于是我们打开Double这个类来看看。...注意关键词1: IEEE 754 java的单精浮点数float和双精浮点数double,符合IEEE 754标准。...如果我们的认知是错误的,任何数除以0都会崩溃,那么我们的分析将会直接绕过真相去推理。于是得出结论,怎么可能有bug,不可能的。 于是浪费了很多时间,去收集线索,去推翻我们固有的认知,才能找到真相。

    1.5K10

    完全合并C++面试题

    此时*p能够改动,而p不能改动。 (4)const char * const p 这样的是地址及指向对象都不能改动。...从名称上也能够看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是由于c++比 c来说扩充的东西太多了,所以就在c后面放上两个+。...于是就成了c++ C语言是结构化编程语言,C++是面向对象编程语言。 C++側重于对象而不是过程,側重于类的设计而不是逻辑的设计。...參数为其它。 以下举例说明。 int func(char s[5]); { cout这里将输出4。本来s为一个数组。...答: 101个先取出2堆, 33,33 第一次称,假设不相等,说明有一堆重或轻 那么把重的那堆拿下来,再放另外35个中的33 假设相等,说明假的重,假设不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻

    37320

    002. java.lang.NumberFormatException: Infinite or NaN,怎么破?

    那么关键点来了:什么情况下一个double类型的值会和POSITIVE_INFINITY/NEGATIVE_INFINITY常量相等呢?...); System.out.println(Double.isNaN(d)); } 运行后的输出结果为: false false -> d==d这个是false哟 true 惊不惊喜,意不意外:...总结一下:浮点数除法计算,分母为0且分子为0,结果就是NaN。并且:每次计算的NaN都永不相等。...Tips:NaN代表不是数字,因此“不是数字”和“不是数字”不相等,从逻辑上好像也说得通嘛 针对此异常的补充说明 围绕POSITIVE_INFINITY、NEGATIVE_INFINITY、NaN三个常量进行一些补充说明吧...Float里的这三个常量和Double一样吗? 弱弱问一句:2023年了在实际业务开发中,不会真有人使用Float吧?吧?吧? 灵魂拷问:如果你使用了Float,收益是什么?是否真的值得?

    1K41

    【CC++教学】浅谈指针函数和函数指针

    其函数原型为:类型* 函数名(形式参数表) 如求两个值中的最大值并返回其地址 ? 输出结果为: 000000000065FE48 000000000065FE48 为什么两个地址值是一样的?...那么有了函数指针的概念后,我们对函数的调用除了用名字的调用方式后,是不是还有别的方式呢? ? 运行结果: just test! just test! just test!...如int test1(int*,double )和int test2(int*,double)是同一个类型的函数,float test3(int , int)与test1和test2就不是相同类型的函数...接下来我们介绍函数指针的表示方式: 返回值类型 (*指针变量名)(形式参数类型) 因为函数指针是指向某一类函数的指针变量,所以也可以这么表示: 函数类型 *指针类型名 那么对于多个类型相同的函数指针,...我们说了一大串,到底函数指针有什么用呢?笼统的讲有两点 1.用函数指针调用函数 2.函数指针像普通指针一样作函数的形式参数 千言万语不如一个例子实在。

    43220

    #Android单元测试学习总结「建议收藏」

    (String message, Object expected, Object actual) 断言两个对象相等,如果不相等则抛出异常携带指定的message信息 assertEquals(float...,如果不相等则抛出异常携带指定的message信息 assertEquals(double expected, double actual, double delta) 断言两个 double 类型 expect...,如果不相等则抛出异常携带指定的message信息 fail() 直接让测试失败 fail(String message) 直接让测试失败并给出message错误信息 assertThat(T actual...那如果想做一些事而不是doNothing呢,跟Mockito一样,采用doAnswer: @Test public void testStaticVoid() throws Exception...,这里需要注意的是如果你使用PowerMockito来mock系统静态final类,则gradle依赖中不能再添加单纯Mockito的依赖库,否则这里将不能mock成功,会提示Mockito can not

    5.1K20

    【C语言】操作符还能这样?

    ,先来分析一波: 此时,我们已经知道的补码,如果编译器是算术移位的话,将会打印出-1如果是逻辑移位的话,将会打印出1,结果会是什么呢?...1才为1,其他为0 | 按位或——有1就是1 ^ 按位异或 ——相同为0,不同为1 注:操作数必须是整数。...这里的位:指的是二进制位,根据原、反、补码进行运算。 这些操作符有什么用呢?...测试一下就行了: 结果是一样的,与顺序无关。 好了,到了这里,我们在重新看一看刚开始的题目:交换两个数,这时候是不是就更加理解了!...long double double float unsigned long int long int unsigned int int 如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算

    81130

    Java 中的 ==, equals 与 hashCode 的区别与联系

    要注意的是,浮点型和整型都是有符号类型的(最高位仅用于表示正负,不参与计算【以 byte 为例,其范围为 -2^7 ~ 2^7 - 1,-0即-128】),而char是无符号类型的(所有位均参与计算,所以...那么我们能不能综合两者的特性,做出一种寻址容易,插入和删除也容易的数据结构?...如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 不要求 一定生成不同的整数结果。...但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。   ...那么, 这里就有一个比较严重的问题:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是 Object.equals 方法了。

    1.5K22

    java面试题基础篇 温故而知新 没事在地铁上多看看

    equals()方法是Object类中的方法,而==运算符是基本类型(如int、float等)的方法。因此,如果要比较一个自定义对象与另一个自定义对象,应该使用equals()方法而不是==运算符。...如果你需要在程序运行过程中频繁地修改字符串,那么使用StringBuilder或StringBuffer可能更合适。而如果你只需要创建一个不可变的字符串常量,那么使用String就足够了。...(强引用):是指在程序中直接使用一个对象时所使用的引用,如果该对象没有其他强引用指向它,那么它会被垃圾回收器回收。...代码重用:通过使用泛型,程序员可以将相同的代码用于不同类型的数据结构,从而提高代码的复用性。 类型擦除:Java泛型实现了类型擦除,这意味着在运行时,实际使用的是原始类型,而不是泛型类型。...hashcode 在Java中,如果两个对象的hashCode()方法没有正确实现,那么它们可能会有相同的hashCode值。

    71571

    小闫陪你入门 Java (四)

    ; } } } 首先定义了一个人的月收入为 5000~7000,那么根据上述程序会输出什么呢?看看吧: 哥们儿你的生活美滋滋~ 借此我们来看一下语句是如何运行的。...然后这个变量会挨个与 case 后方的值进行比较,直到相等(变量类型需相同,而且必须是常量或者字面常量) 字母常量是类型为简单类型、String类型和空类型的值在源程序中的表现。...如果都不相等,那么会输出 default 中的语句。在每个 case 语句中如果遇到 break 会终止执行,否则继续比较,但是 default 分支是不需要 break 语句的。...官方封装这两个类并不是吃饱了撑的,而是考虑到实际开发过程中,经常需要对象,所以为内置数据类型提供其包装类。它们有 Integer、Long、Byte、Double、Float 以及 Short。...它可以如同内置数据类型直接用来声明变量: Integer num = 10; 那么 Math 类呢? Math 类顾名思义,包含大量的数学运算的方法以及属性等。常见的对数、三角函数等都有。

    38330

    (26) 剖析包装类 (上) 计算机程序的思维逻辑

    包装类有什么用呢?Java中很多代码(比如后续文章介绍的集合类)只能操作对象,为了能操作基本类型,需要使用其对应的包装类,另外,包装类提供了很多有用的方法,可以方便对数据的操作。...new每次都会创建一个新对象,而除了Float和Double外的其他包装类,都会缓存包装类对象,减少需要创建对象的次数,节省空间,提升性能,后续我们会分析其具体代码。...hashCode hashCode返回一个对象的哈希值,哈希值是一个int类型的数,由对象中一般不变的属性映射得来,用于快速对对象进行区分、分组等。一个对象的哈希值不能变,相同对象的哈希值必须一样。...不同对象的哈希值一般应不同,但这不是必须的,可以有不同对象但哈希值相同的情况。...这是通过如下方式强制实现的: 所有包装类都声明为了final,不能被继承 内部基本类型值是私有的,且声明为了final 没有定义setter方法 为什么要定义为不可变类呢?

    560100
    领券