zoukankan      html  css  js  c++  java
  • 浮点数精度问题: double 无法精确表示long

    为什么无法 精准转换呢

            double doubleMaxValue = Double.MAX_VALUE;
            System.out.println("doubleMaxValue = " + doubleMaxValue);
            System.out.println("doubleMaxValue -1 = " + (doubleMaxValue - 1)); // 打印的结果和上面的完全一样
            System.out.println("doubleMaxValue equals = " + (doubleMaxValue - 1 == doubleMaxValue));// 竟然是 true
    
            double doubleMaxValue2 = (Long.MAX_VALUE / 2L) ;
            System.out.println("doubleMaxValue = " + doubleMaxValue2);
            System.out.println("doubleMaxValue -1 = " + (doubleMaxValue2 - 1)); // 打印的结果和上面的完全一样
            System.out.println("doubleMaxValue equals = " + (doubleMaxValue2 - 1 == doubleMaxValue2));// 竟然是 true
    
            Long longMaxValue = Long.MAX_VALUE;
            System.out.println("longMaxValue = " + longMaxValue);// 9223372036854775807
            System.out.println("doubleMaxValue -doubleMaxValue  = " + ( doubleMaxValue - longMaxValue));// 打印的结果和 Double.MAX_VALUE的完全一样, 减去相当于没有减..
            
            // 0x7fffffffffffffffL
            // 0x7fefffffffffffffL
            BigDecimal longBigDecimal = new BigDecimal(longMaxValue);// 和直接打印是一样的
            System.out.println("longBigDecimal = " + longBigDecimal);
            System.out.println("Double.longBitsToDouble(0x7fefffffffffffffL) = " + Double.longBitsToDouble(0x7fefffffffffffffL));
            BigDecimal doubleMinValue = new BigDecimal(Double.MIN_VALUE);
            System.out.println("doubleMinValue = " + doubleMinValue);// 4.9e-324: 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625E-324
            BigDecimal doubleBigDecimal = new BigDecimal(doubleMaxValue);
            System.out.println("doubleBigDecimal = " + doubleBigDecimal);// 308位数字,10的308次方: 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
    
            double doubleMaxValue2a = doubleMaxValue - 1;
            BigDecimal bigDecimal2 = new BigDecimal(doubleMaxValue2a);
            System.out.println("bigDecimal2 = " + bigDecimal2);// 和doubleBigDecimal 结果 是一样的!
    
            if (doubleMaxValue == doubleMaxValue2a) {
                System.out.println("doubleMaxValue2a ==== " + doubleMaxValue2a); // doubleMaxValue - 1 和 doubleMaxValue 完全一样..
            }
    
            BigDecimal bigDecimal3 = new BigDecimal(Float.MAX_VALUE);
            System.out.println("bigDecimal3 = " + bigDecimal3);//  3.4028235e+38f:  340282346638528859811704183484516925440
    
            BigDecimal bigDecimal3a = new BigDecimal(Float.MIN_VALUE);
            System.out.println("bigDecimalMin = " + bigDecimal3a);// 1.4e-45f: 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125E-45
    
            double nan = Double.longBitsToDouble(0xfff0000000000001L); // longBitsToDouble(0x7fefffffffffffffL).
            System.out.println("longBitsToDouble = " + nan); // 竟然是 NaN , why ? 超过了最大值?
            double positiveInfinity = Double.longBitsToDouble(0x7ff0000000000000L);
            System.out.println("positiveInfinity = " + positiveInfinity);
            double positiveInfinity2 = Double.longBitsToDouble(0xfff0000000000000L);
            System.out.println("positiveInfinity2 = " + positiveInfinity2);
    
            long number = 499999999000000001L;
            double converted = (double) number;
            System.out.println( "long - (double) converted " + ( number - (long) converted )); // 精度丢失1
            System.out.println( "long -   converted " + ( number -  converted ));
            Long i = 1000000123456789012L;
            System.out.println("Long = " + i); // Long 永远不会丢失精度!
            String s = i + "";
            /*
                float的精度是6位有效数字,取值范围是10的-38次方到10的38次方,float占用4字节空间
                double的精度是15位有效数字,取值范围是10的-308次方到10的308次方,double占用8字节空间。
             */
            Double d = Double.parseDouble(s);
            System.out.println("Double = " + d);// 100000012345678 都是准确的, 901 后面的精度全部丢失!!   Double 的精度是;
            // 1.00000012345678896E17 的后面的 896是怎么来的?
    
            Float f = Float.parseFloat(s);
            System.out.println("Float = " + f);
    
    
            double v = Double.longBitsToDouble(i);
            System.out.println("Double longBitsToDouble = " + v);
    
    
            Double dd = 10000001234567890123D;
            System.out.println("Double " + dd);// 1.000000123456789E19 和字面值不一样!
            double v1 = BigDecimal.valueOf(dd).doubleValue();
            System.out.println("BigDecimal doubleValue " + v1);// 1.000000123456789E19
    
            dd = 123456789876543219123456789D;
            System.out.println("Double " + dd);//dd = 1.2345678987654321E26, 小数位16位,而 精度最多是15位; 而且貌似也并不会 四舍五入!
            v1 = BigDecimal.valueOf(dd).doubleValue();
            System.out.println("BigDecimal doubleValue " + v1);
    
            dd = 123456789876543D;
            System.out.println("Double " + dd);//dd = 1.
            v1 = BigDecimal.valueOf(dd).doubleValue();
            System.out.println("BigDecimal doubleValue " + v1);
    
    
            dd = 12345678.9876543210D;
            System.out.println("Double " + dd);//dd = 1.
            v1 = BigDecimal.valueOf(dd).doubleValue();
            System.out.println("BigDecimal doubleValue " + v1);
    
            dd = 12345678.9876543280D;
            System.out.println("Double " + dd);//dd = 1.
            v1 = BigDecimal.valueOf(dd).doubleValue();
            System.out.println("BigDecimal doubleValue " + v1);
    
            dd = 12345678.9876543289D;
            System.out.println("Double " + dd);//dd = 1.
            v1 = BigDecimal.valueOf(dd).doubleValue();
            System.out.println("BigDecimal doubleValue " + v1);
    
    
            dd = 12345678.9876543219876543D;
            System.out.println("Double " + dd);//dd = 1.2345678987654323E7
            v1 = BigDecimal.valueOf(dd).doubleValue();
            System.out.println("BigDecimal doubleValue " + v1);
    
            float f1 = 98765432123456789f;
            System.out.println("float = " + f1); // 9.8765436E16 , 在5432 的位置 失去精度
    
            f1 = 98765456789f;
            System.out.println("float = " + f1);// 9.8765455E10 小数位7位,而 精度最多是6位;

    打印

    D:devTooljdk1.8.0_161injava.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:64828,suspend=y,server=n -Xms1048m -Xmx1048m -javaagent:C:UserslkAppDataLocalJetBrainsIntelliJIdea2021.1captureAgentdebugger-agent.jar -Dfile.encoding=UTF-8 -classpath "D:devTooljdk1.8.0_161jrelibcharsets.jar;D:devTooljdk1.8.0_161jrelibdeploy.jar;D:devTooljdk1.8.0_161jrelibextaccess-bridge-64.jar;D:devTooljdk1.8.0_161jrelibextcldrdata.jar;D:devTooljdk1.8.0_161jrelibextdnsns.jar;D:devTooljdk1.8.0_161jrelibextjaccess.jar;D:devTooljdk1.8.0_161jrelibextjfxrt.jar;D:devTooljdk1.8.0_161jrelibextlocaledata.jar;D:devTooljdk1.8.0_161jrelibext
    ashorn.jar;D:devTooljdk1.8.0_161jrelibextsunec.jar;D:devTooljdk1.8.0_161jrelibextsunjce_provider.jar;D:devTooljdk1.8.0_161jrelibextsunmscapi.jar;D:devTooljdk1.8.0_161jrelibextsunpkcs11.jar;D:devTooljdk1.8.0_161jrelibextzipfs.jar;D:devTooljdk1.8.0_161jrelibjavaws.jar;D:devTooljdk1.8.0_161jrelibjce.jar;D:devTooljdk1.8.0_161jrelibjfr.jar;D:devTooljdk1.8.0_161jrelibjfxswt.jar;D:devTooljdk1.8.0_161jrelibjsse.jar;D:devTooljdk1.8.0_161jrelibmanagement-agent.jar;D:devTooljdk1.8.0_161jrelibplugin.jar;D:devTooljdk1.8.0_161jrelib
    esources.jar;D:devTooljdk1.8.0_161jrelib
    t.jar;D:codegitmwumc-spgate-sms	arget	est-classes;D:codegitmwumc-spgate-sms	argetclasses;C:Userslk.m2
    epositorycommontnetsumcspgate-std1.0.0.1spgate-std-1.0.0.1.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter2.4.2spring-boot-starter-2.4.2.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-autoconfigure2.4.2spring-boot-autoconfigure-2.4.2.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter-logging2.4.2spring-boot-starter-logging-2.4.2.jar;C:Userslk.m2
    epositorychqoslogbacklogback-classic1.2.3logback-classic-1.2.3.jar;C:Userslk.m2
    epositorychqoslogbacklogback-core1.2.3logback-core-1.2.3.jar;C:Userslk.m2
    epositoryorgapachelogginglog4jlog4j-to-slf4j2.13.3log4j-to-slf4j-2.13.3.jar;C:Userslk.m2
    epositoryorgapachelogginglog4jlog4j-api2.13.3log4j-api-2.13.3.jar;C:Userslk.m2
    epositoryorgslf4jjul-to-slf4j1.7.30jul-to-slf4j-1.7.30.jar;C:Userslk.m2
    epositoryjakartaannotationjakarta.annotation-api1.3.5jakarta.annotation-api-1.3.5.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-core5.3.3spring-core-5.3.3.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-jcl5.3.3spring-jcl-5.3.3.jar;C:Userslk.m2
    epositoryorgyamlsnakeyaml1.27snakeyaml-1.27.jar;C:Userslk.m2
    epositorycommontnetsumccommon1.0.0.1common-1.0.0.1.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter-web2.4.2spring-boot-starter-web-2.4.2.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter-json2.4.2spring-boot-starter-json-2.4.2.jar;C:Userslk.m2
    epositorycomfasterxmljacksondatatypejackson-datatype-jdk82.11.4jackson-datatype-jdk8-2.11.4.jar;C:Userslk.m2
    epositorycomfasterxmljacksondatatypejackson-datatype-jsr3102.11.4jackson-datatype-jsr310-2.11.4.jar;C:Userslk.m2
    epositorycomfasterxmljacksonmodulejackson-module-parameter-names2.11.4jackson-module-parameter-names-2.11.4.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter-tomcat2.4.2spring-boot-starter-tomcat-2.4.2.jar;C:Userslk.m2
    epositoryorgapache	omcatembed	omcat-embed-core9.0.41	omcat-embed-core-9.0.41.jar;C:Userslk.m2
    epositoryorgglassfishjakarta.el3.0.3jakarta.el-3.0.3.jar;C:Userslk.m2
    epositoryorgapache	omcatembed	omcat-embed-websocket9.0.41	omcat-embed-websocket-9.0.41.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-webmvc5.3.3spring-webmvc-5.3.3.jar;C:Userslk.m2
    epositoryorgapachecommonscommons-lang33.11commons-lang3-3.11.jar;C:Userslk.m2
    epositorycommons-collectionscommons-collections3.2.1commons-collections-3.2.1.jar;C:Userslk.m2
    epositorycomelerwebpinyin4j2.5.1pinyin4j-2.5.1.jar;C:Userslk.m2
    epositoryorgquartz-schedulerquartz2.3.2quartz-2.3.2.jar;C:Userslk.m2
    epositorycommchangemchange-commons-java.2.15mchange-commons-java-0.2.15.jar;C:Userslk.m2
    epositoryorgapachehttpcomponentshttpclient4.5.13httpclient-4.5.13.jar;C:Userslk.m2
    epositoryorgapache
    ocketmq
    ocketmq-client4.7.0
    ocketmq-client-4.7.0.jar;C:Userslk.m2
    epositoryorgapache
    ocketmq
    ocketmq-common4.7.0
    ocketmq-common-4.7.0.jar;C:Userslk.m2
    epositoryorgapache
    ocketmq
    ocketmq-remoting4.7.0
    ocketmq-remoting-4.7.0.jar;C:Userslk.m2
    epositoryorgapache
    ocketmq
    ocketmq-logging4.7.0
    ocketmq-logging-4.7.0.jar;C:Userslk.m2
    epositoryio
    etty
    etty-tcnative-boringssl-static2.0.36.Final
    etty-tcnative-boringssl-static-2.0.36.Final.jar;C:Userslk.m2
    epositorycommons-validatorcommons-validator1.6commons-validator-1.6.jar;C:Userslk.m2
    epositorycommons-beanutilscommons-beanutils1.9.2commons-beanutils-1.9.2.jar;C:Userslk.m2
    epositorycommons-digestercommons-digester1.8.1commons-digester-1.8.1.jar;C:Userslk.m2
    epositoryorgouncycastlecprov-jdk15on1.64cprov-jdk15on-1.64.jar;C:Userslk.m2
    epositoryorg
    edisson
    edisson3.12.0
    edisson-3.12.0.jar;C:Userslk.m2
    epositoryio
    etty
    etty-common4.1.58.Final
    etty-common-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-buffer4.1.58.Final
    etty-buffer-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-resolver-dns4.1.58.Final
    etty-resolver-dns-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-codec-dns4.1.58.Final
    etty-codec-dns-4.1.58.Final.jar;C:Userslk.m2
    epositoryjavaxcachecache-api1.1.1cache-api-1.1.1.jar;C:Userslk.m2
    epositoryioprojectreactor
    eactor-core3.4.2
    eactor-core-3.4.2.jar;C:Userslk.m2
    epositoryorg
    eactivestreams
    eactive-streams1.0.3
    eactive-streams-1.0.3.jar;C:Userslk.m2
    epositoryio
    eactivex
    xjava2
    xjava2.2.20
    xjava-2.2.20.jar;C:Userslk.m2
    epositorycomfasterxmljacksondataformatjackson-dataformat-yaml2.11.4jackson-dataformat-yaml-2.11.4.jar;C:Userslk.m2
    epositorycomfasterxmljacksoncorejackson-core2.11.4jackson-core-2.11.4.jar;C:Userslk.m2
    epositorycomfasterxmljacksoncorejackson-databind2.11.4jackson-databind-2.11.4.jar;C:Userslk.m2
    epository
    etytebuddyyte-buddy1.10.19yte-buddy-1.10.19.jar;C:Userslk.m2
    epositoryorgjoddjodd-bean5.0.13jodd-bean-5.0.13.jar;C:Userslk.m2
    epositoryorgjoddjodd-core5.0.13jodd-core-5.0.13.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter-data-redis2.4.2spring-boot-starter-data-redis-2.4.2.jar;C:Userslk.m2
    epositoryorgspringframeworkdataspring-data-redis2.4.3spring-data-redis-2.4.3.jar;C:Userslk.m2
    epositoryorgspringframeworkdataspring-data-keyvalue2.4.3spring-data-keyvalue-2.4.3.jar;C:Userslk.m2
    epositoryorgspringframeworkdataspring-data-commons2.4.3spring-data-commons-2.4.3.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-tx5.3.3spring-tx-5.3.3.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-oxm5.3.3spring-oxm-5.3.3.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-context-support5.3.3spring-context-support-5.3.3.jar;C:Userslk.m2
    epository
    edisclientsjedis3.3.0jedis-3.3.0.jar;C:Userslk.m2
    epositoryorgapachecommonscommons-pool22.9.0commons-pool2-2.9.0.jar;C:Userslk.m2
    epositoryjakartavalidationjakarta.validation-api2.0.2jakarta.validation-api-2.0.2.jar;C:Userslk.m2
    epositorycomaomidoumybatis-plus-extension3.4.3mybatis-plus-extension-3.4.3.jar;C:Userslk.m2
    epositorycomaomidoumybatis-plus-core3.4.3mybatis-plus-core-3.4.3.jar;C:Userslk.m2
    epositorycomaomidoumybatis-plus-annotation3.4.3mybatis-plus-annotation-3.4.3.jar;C:Userslk.m2
    epositorycomgithubjsqlparserjsqlparser4.0jsqlparser-4.0.jar;C:Userslk.m2
    epositoryorgmybatismybatis-spring2.0.6mybatis-spring-2.0.6.jar;C:Userslk.m2
    epositoryorg
    oaringbitmapRoaringBitmap.9.15RoaringBitmap-0.9.15.jar;C:Userslk.m2
    epositoryorg
    oaringbitmapshims.9.15shims-0.9.15.jar;C:Userslk.m2
    epositorycomcarrotsearchjava-sizeof.0.5java-sizeof-0.0.5.jar;C:Userslk.m2
    epositorycommontnetsumcumc-bill1.0.0.1umc-bill-1.0.0.1.jar;C:Userslk.m2
    epositorycommontnetsumcumc-cache1.0.0.1umc-cache-1.0.0.1.jar;C:Userslk.m2
    epositorycomaomidoumybatis-plus-boot-starter3.4.3mybatis-plus-boot-starter-3.4.3.jar;C:Userslk.m2
    epositorycomaomidoumybatis-plus3.4.3mybatis-plus-3.4.3.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter-jdbc2.4.2spring-boot-starter-jdbc-2.4.2.jar;C:Userslk.m2
    epositorycomzaxxerHikariCP3.4.5HikariCP-3.4.5.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-jdbc5.3.3spring-jdbc-5.3.3.jar;C:Userslk.m2
    epositorycomaomidoumybatis-plus-generator3.5.0mybatis-plus-generator-3.5.0.jar;C:Userslk.m2
    epositoryorgmybatismybatis-typehandlers-jsr3101.0.2mybatis-typehandlers-jsr310-1.0.2.jar;C:Userslk.m2
    epositorycomalibabadruid-spring-boot-starter1.1.10druid-spring-boot-starter-1.1.10.jar;C:Userslk.m2
    epositorycomalibabadruid1.1.10druid-1.1.10.jar;C:Userslk.m2
    epositorymysqlmysql-connector-java8.0.13mysql-connector-java-8.0.13.jar;C:Userslk.m2
    epositorycomgoogleprotobufprotobuf-java3.6.1protobuf-java-3.6.1.jar;C:Userslk.m2
    epositorycnhutoolhutool-all5.5.4hutool-all-5.5.4.jar;C:Userslk.m2
    epositorycommontnetsumcprotocol-unified1.0.0.1protocol-unified-1.0.0.1.jar;C:Userslk.m2
    epositorycommontnetsumchttp-net-std1.0.0.1http-net-std-1.0.0.1.jar;C:Userslk.m2
    epositoryio
    etty
    etty-transport-native-epoll4.1.58.Final
    etty-transport-native-epoll-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-transport-native-unix-common4.1.58.Final
    etty-transport-native-unix-common-4.1.58.Final.jar;C:Userslk.m2
    epositorycommontnetsumcprotocol-sms-std-ex1.0.0.1protocol-sms-std-ex-1.0.0.1.jar;C:Userslk.m2
    epositorycommontnetsumcprotocol-sms-interface1.0.0.1protocol-sms-interface-1.0.0.1.jar;C:Userslk.m2
    epositorycommontnetsumcprotocol-sms-std1.0.0.1protocol-sms-std-1.0.0.1.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-aop5.3.3spring-aop-5.3.3.jar;C:Userslk.m2
    epositoryde
    uedigermoellerfst2.48-jdk-6fst-2.48-jdk-6.jar;C:Userslk.m2
    epositoryorgjavassistjavassist3.19.0-GAjavassist-3.19.0-GA.jar;C:Userslk.m2
    epositoryorgobjenesisobjenesis2.4objenesis-2.4.jar;C:Userslk.m2
    epositorycomcedarsoftwarejava-util1.9.0java-util-1.9.0.jar;C:Userslk.m2
    epositorycommons-langcommons-lang2.6commons-lang-2.6.jar;C:Userslk.m2
    epository
    ekohtml
    ekohtml1.9.6.2
    ekohtml-1.9.6.2.jar;C:Userslk.m2
    epositoryxercesxercesImpl2.8.1xercesImpl-2.8.1.jar;C:Userslk.m2
    epositoryxml-apisxml-apis1.3.03xml-apis-1.3.03.jar;C:Userslk.m2
    epositorycommons-codeccommons-codec1.15commons-codec-1.15.jar;C:Userslk.m2
    epositoryorgfreemarkerfreemarker2.3.30freemarker-2.3.30.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-test5.3.3spring-test-5.3.3.jar;C:Userslk.m2
    epositoryorgapachehttpcomponentshttpclient-cache4.5.13httpclient-cache-4.5.13.jar;C:Userslk.m2
    epositorycommons-loggingcommons-logging1.2commons-logging-1.2.jar;C:Userslk.m2
    epositoryorgapachehttpcomponentshttpmime4.5.13httpmime-4.5.13.jar;C:Userslk.m2
    epositoryorgapachehttpcomponentshttpcore4.4.14httpcore-4.4.14.jar;C:Userslk.m2
    epositoryio
    etty
    etty-transport4.1.58.Final
    etty-transport-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-resolver4.1.58.Final
    etty-resolver-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-codec4.1.58.Final
    etty-codec-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-handler-proxy4.1.58.Final
    etty-handler-proxy-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-codec-socks4.1.58.Final
    etty-codec-socks-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-codec-http4.1.58.Final
    etty-codec-http-4.1.58.Final.jar;C:Userslk.m2
    epositoryio
    etty
    etty-handler4.1.58.Final
    etty-handler-4.1.58.Final.jar;C:Userslk.m2
    epositorycomsleepycatje5.0.73je-5.0.73.jar;C:Userslk.m2
    epositorycommons-iocommons-io2.5commons-io-2.5.jar;C:Userslk.m2
    epositoryorgopensmppopensmpp-core3.0.0opensmpp-core-3.0.0.jar;C:Userslk.m2
    epositoryorgopensmppopensmpp-charset3.0.0opensmpp-charset-3.0.0.jar;C:Userslk.m2
    epositorycomxuxuelixxl-job-core2.3.0xxl-job-core-2.3.0.jar;C:Userslk.m2
    epositoryio
    etty
    etty-all4.1.58.Final
    etty-all-4.1.58.Final.jar;C:Userslk.m2
    epositoryorgcodehausgroovygroovy2.5.14groovy-2.5.14.jar;C:Userslk.m2
    epositoryorgslf4jslf4j-api1.7.30slf4j-api-1.7.30.jar;C:Userslk.m2
    epositoryorgmybatismybatis3.5.7mybatis-3.5.7.jar;C:Userslk.m2
    epositorycomgithubulisesbocchiojasypt-spring-boot-starter2.1.0jasypt-spring-boot-starter-2.1.0.jar;C:Userslk.m2
    epositorycomgithubulisesbocchiojasypt-spring-boot2.1.0jasypt-spring-boot-2.1.0.jar;C:Userslk.m2
    epositoryorgjasyptjasypt1.9.2jasypt-1.9.2.jar;C:Userslk.m2
    epositoryiospringfoxspringfox-swagger22.8.0springfox-swagger2-2.8.0.jar;C:Userslk.m2
    epositoryioswaggerswagger-annotations1.5.14swagger-annotations-1.5.14.jar;C:Userslk.m2
    epositoryioswaggerswagger-models1.5.14swagger-models-1.5.14.jar;C:Userslk.m2
    epositorycomfasterxmljacksoncorejackson-annotations2.11.4jackson-annotations-2.11.4.jar;C:Userslk.m2
    epositoryiospringfoxspringfox-spi2.8.0springfox-spi-2.8.0.jar;C:Userslk.m2
    epositoryiospringfoxspringfox-core2.8.0springfox-core-2.8.0.jar;C:Userslk.m2
    epositoryiospringfoxspringfox-schema2.8.0springfox-schema-2.8.0.jar;C:Userslk.m2
    epositoryiospringfoxspringfox-swagger-common2.8.0springfox-swagger-common-2.8.0.jar;C:Userslk.m2
    epositoryiospringfoxspringfox-spring-web2.8.0springfox-spring-web-2.8.0.jar;C:Userslk.m2
    epositoryorg
    eflections
    eflections.9.11
    eflections-0.9.11.jar;C:Userslk.m2
    epositorycomgoogleguavaguava20.0guava-20.0.jar;C:Userslk.m2
    epositorycomfasterxmlclassmate1.5.1classmate-1.5.1.jar;C:Userslk.m2
    epositoryorgspringframeworkpluginspring-plugin-core1.2.0.RELEASEspring-plugin-core-1.2.0.RELEASE.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-beans5.3.3spring-beans-5.3.3.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-context5.3.3spring-context-5.3.3.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-expression5.3.3spring-expression-5.3.3.jar;C:Userslk.m2
    epositoryorgspringframeworkpluginspring-plugin-metadata1.2.0.RELEASEspring-plugin-metadata-1.2.0.RELEASE.jar;C:Userslk.m2
    epositoryorgmapstructmapstruct1.2.0.Finalmapstruct-1.2.0.Final.jar;C:Userslk.m2
    epositoryiospringfoxspringfox-swagger-ui2.8.0springfox-swagger-ui-2.8.0.jar;C:Userslk.m2
    epositorycomgooglecodegsongson2.8.5gson-2.8.5.jar;C:Userslk.m2
    epositorycomalibabafastjson1.2.58fastjson-1.2.58.jar;C:Userslk.m2
    epositoryorgspringframeworkcloudspring-cloud-starter-openfeign3.0.0spring-cloud-starter-openfeign-3.0.0.jar;C:Userslk.m2
    epositoryorgspringframeworkcloudspring-cloud-starter3.0.0spring-cloud-starter-3.0.0.jar;C:Userslk.m2
    epositoryorgspringframeworkcloudspring-cloud-context3.0.0spring-cloud-context-3.0.0.jar;C:Userslk.m2
    epositoryorgspringframeworksecurityspring-security-rsa1.0.9.RELEASEspring-security-rsa-1.0.9.RELEASE.jar;C:Userslk.m2
    epositoryorgouncycastlecpkix-jdk15on1.64cpkix-jdk15on-1.64.jar;C:Userslk.m2
    epositoryorgspringframeworkcloudspring-cloud-openfeign-core3.0.0spring-cloud-openfeign-core-3.0.0.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-starter-aop2.4.2spring-boot-starter-aop-2.4.2.jar;C:Userslk.m2
    epositoryorgaspectjaspectjweaver1.9.6aspectjweaver-1.9.6.jar;C:Userslk.m2
    epositoryiogithubopenfeignformfeign-form-spring3.8.0feign-form-spring-3.8.0.jar;C:Userslk.m2
    epositoryiogithubopenfeignformfeign-form3.8.0feign-form-3.8.0.jar;C:Userslk.m2
    epositorycommons-fileuploadcommons-fileupload1.4commons-fileupload-1.4.jar;C:Userslk.m2
    epositoryorgspringframeworkspring-web5.3.3spring-web-5.3.3.jar;C:Userslk.m2
    epositoryorgspringframeworkcloudspring-cloud-commons3.0.0spring-cloud-commons-3.0.0.jar;C:Userslk.m2
    epositoryorgspringframeworksecurityspring-security-crypto5.4.2spring-security-crypto-5.4.2.jar;C:Userslk.m2
    epositoryiogithubopenfeignfeign-core10.10.1feign-core-10.10.1.jar;C:Userslk.m2
    epositoryiogithubopenfeignfeign-slf4j10.10.1feign-slf4j-10.10.1.jar;C:Userslk.m2
    epositoryorgprojectlomboklombok1.18.14lombok-1.18.14.jar;C:Userslk.m2
    epositoryjunitjunit4.13.1junit-4.13.1.jar;C:Userslk.m2
    epositoryorghamcresthamcrest-core2.2hamcrest-core-2.2.jar;C:Userslk.m2
    epositoryorghamcresthamcrest2.2hamcrest-2.2.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot-test2.4.2spring-boot-test-2.4.2.jar;C:Userslk.m2
    epositoryorgspringframeworkootspring-boot2.4.2spring-boot-2.4.2.jar;C:Userslk.m2
    epositorycomgithuben-manescaffeinecaffeine2.8.8caffeine-2.8.8.jar;C:Userslk.m2
    epositoryorgcheckerframeworkchecker-qual3.8.0checker-qual-3.8.0.jar;C:Userslk.m2
    epositorycomgoogleerrorproneerror_prone_annotations2.4.0error_prone_annotations-2.4.0.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.1libidea_rt.jar" test.lk.TestColl
    Connected to the target VM, address: '127.0.0.1:64828', transport: 'socket'
    l2 = 1053294592
    l1 = 1025821608
    l = 1053294592
    doubleMaxValue = 1.7976931348623157E308
    doubleMaxValue -1 = 1.7976931348623157E308
    doubleMaxValue equals = true
    doubleMaxValue = 4.6116860184273879E18
    doubleMaxValue -1 = 4.6116860184273879E18
    doubleMaxValue equals = true
    longMaxValue = 9223372036854775807
    doubleMaxValue -doubleMaxValue  = 1.7976931348623157E308
    longBigDecimal = 9223372036854775807
    Double.longBitsToDouble(0x7fefffffffffffffL) = 1.7976931348623157E308
    doubleMinValue = 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625E-324
    doubleBigDecimal = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
    bigDecimal2 = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
    doubleMaxValue2a ==== 1.7976931348623157E308
    bigDecimal3 = 340282346638528859811704183484516925440
    bigDecimalMin = 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125E-45
    longBitsToDouble = NaN
    positiveInfinity = Infinity
    positiveInfinity2 = -Infinity
    long - (double) converted 1
    long -   converted 0.0
    Long = 1000000123456789012
    Double = 1.00000012345678899E18
    Float = 1.00000012E18
    Double longBitsToDouble = 7.833158944544174E-242
    Double 1.000000123456789E19
    BigDecimal doubleValue 1.000000123456789E19
    Double 1.2345678987654321E26
    BigDecimal doubleValue 1.2345678987654321E26
    Double 1.23456789876543E14
    BigDecimal doubleValue 1.23456789876543E14
    Double 1.234567898765432E7
    BigDecimal doubleValue 1.234567898765432E7
    Double 1.2345678987654328E7
    BigDecimal doubleValue 1.2345678987654328E7
    Double 1.2345678987654328E7
    BigDecimal doubleValue 1.2345678987654328E7
    Double 1.2345678987654323E7
    BigDecimal doubleValue 1.2345678987654323E7
    float = 9.8765436E16
    float = 9.8765455E10
    Disconnected from the target VM, address: '127.0.0.1:64828', transport: 'socket'
    
    Process finished with exit code 0

    Double.MAX_VALUE 是 308位数字,10的308次方: 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

    但是精度远不够308, 而是15

    但是

    double 无法精确表示long,虽然double 的最大值比long的最大值 大, 但是不行。

    关于 ZSET  的问题

    zset 的分数是double 类型的, 当然, 传一个long 值进去, 也不会报错,但是呢, 可能会出现精度丢失, 从而导致 很多 value 一个分数的问题!

    zrangeByScoreWithScores 

    比如这样的 score,就不行了: 7404750117679876609D

    package test.lk;
    
    import com.montnets.umc.common.constant.RedisTopicConstant;
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisPoolConfig;
    import redis.clients.jedis.Tuple;
    
    import java.io.IOException;
    import java.util.HashSet;
    import java.util.Set;
     
    public class TestJedisCluster {
        public static void main(String[] args) throws IOException {
            
            // 创建集群的节点集合
            Set<HostAndPort> nodes = new HashSet<>();
            
            // 添加节点到集群中
            String host = "127.0.0.1";
            host = "192.169.6.157:7003,192.169.6.157:7004,192.169.6.157:7005";
            host = "192.169.6.157";
            nodes.add(new HostAndPort(host, 7003));
            nodes.add(new HostAndPort(host, 7004));
            nodes.add(new HostAndPort(host, 7005));
    //        nodes.add(new HostAndPort(host, 6382));
    //        nodes.add(new HostAndPort(host, 6383));
    //        nodes.add(new HostAndPort(host, 6384));
    //        nodes.add(new HostAndPort(host, 6385));
    //        nodes.add(new HostAndPort(host, 6386));
            
            // 读取Redis Pool的配置文件(位于classpath目录下)
    //        InputStream _is = TestJedisCluster.class.getClassLoader().getResourceAsStream("redis_pool.properties");
    //        Properties props = new Properties();
    //        props.load(_is);
            
            // 读取配置项
    //        int maxTotal = Integer.parseInt(props.getProperty("redis_maxTotal"));
    //        int maxIdle = Integer.parseInt(props.getProperty("redis_maxIdle"));
    //        int MinIdle = Integer.parseInt(props.getProperty("redis_minIdle"));
            
            // 设置Redis Pool相关参数
            JedisPoolConfig poolConfig = new JedisPoolConfig();
    //        poolConfig.setMaxTotal(maxTotal);
    //        poolConfig.setMaxIdle(maxIdle);
    //        poolConfig.setMinIdle(MinIdle);
            
            // 利用上面的集群节点nodes和poolConfig,创建redis集群连接池,并获取一个redis连接
            JedisCluster jedisCluster = new JedisCluster(nodes, poolConfig);
            
            // 利用获取的jedisCluster可以进行jedis的所有操作
            System.out.println(jedisCluster.set("name", "beyond"));
            System.out.println(jedisCluster.get("age"));
            System.out.println(jedisCluster.get("name"));
    
            double spMsgIdDo = 7403613772412279385D;
            double spMsgIdDo2 = 7403613772412279385D;
            long zcount = jedisCluster.zcount(RedisTopicConstant.TOPIC_SMS_MT_AWAIT_RPT_ZSET + "1", spMsgIdDo, spMsgIdDo2 );
            System.out.println("zcount = " + zcount);// 竟然返回是 307, 为什么有这么多数据? 前面刚刚zadd 进去的, 而且分数竟然是 7.4036137724122798E18
    
            Set<Tuple> zrangeByScore = jedisCluster.zrangeByScoreWithScores(RedisTopicConstant.TOPIC_SMS_MT_AWAIT_RPT_ZSET + "1", spMsgIdDo, spMsgIdDo2 );
            System.out.println("zrangeByScore = " + zrangeByScore);
    
            Set<Tuple> tuples = jedisCluster.zrangeByScoreWithScores(RedisTopicConstant.TOPIC_SMS_MT_AWAIT_RPT_ZSET + "1", spMsgIdDo, spMsgIdDo2);
            System.out.println("tuples = " + tuples);
    
    //        Set<String> keys = jedisCluster.keys("umc:sms:mt_await_rpt_zset1*"); // JedisCluster only supports KEYS commands with patterns containing hash-tags ( curly-brackets enclosed strings )
    //        System.out.println("keys = " + keys);
    
    
            Long aa = jedisCluster.zadd("test.zset1", Integer.MAX_VALUE - 1, "MAX_VALUE -");
    
            Double sc1 = Integer.MAX_VALUE + 4D;
            System.out.println("sc1 = " + sc1);
            System.out.println("sc1 = " + (sc1 - Integer.MAX_VALUE));
            aa = jedisCluster.zadd("test.zset1", Integer.MAX_VALUE + 1, "MAX_VALUE +");
            aa = jedisCluster.zadd("test.zset1", Integer.MAX_VALUE , "MAX_VALUE");
            aa = jedisCluster.zadd("test.zset1", 7404750117679876609D, "bb");
            aa = jedisCluster.zadd("test.zset1", 7404750117679876601D, "cc");
            aa = jedisCluster.zadd("test.zset1", 7404750117679876690D, "dd");
    
            System.out.println("tuples = " + aa);
    
    
            Set<Tuple> strings = jedisCluster.zrangeByScoreWithScores("test.zset1", Integer.MAX_VALUE-1, Integer.MAX_VALUE);
            System.out.println("strings = " + strings);
    
            strings = jedisCluster.zrangeByScoreWithScores("test.zset1", Integer.MAX_VALUE - 1D, sc1 + 1);
            System.out.println("strings = " + strings);
    
            // 归还连接
            jedisCluster.close();
    
            long lo = Long.parseLong("7404750117679876690");
    //        long lo = Long.parseLong("9223372036854775807");
            System.out.println(" --- " + lo);
    
            String s = "7403613772412279385";
            s = "74036137724122751";
            double v = Double.parseDouble(s);
            double v2 = Double.valueOf(s);
    
        }
    }

    郁闷

    浮点数啊, 要小心!

    ...


    版权声明
    本文原创发表于 博客园,作者为 阿K .     本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    欢迎关注本人微信公众号:觉醒的码农,或者扫码进群:

  • 相关阅读:
    数据结构 练习 22-并查集以及图的最小生成树
    C# 上传RAR文件 解压 获取解压后的文件名称
    [置顶] 程序员学数据库那些事儿
    编程挑战:字符串的完美度
    Hibernate主键生成策略
    利用冒泡排序对数组进行排序
    小学生玩ACM----广搜
    CGContext绘图
    [置顶] 《Windows编程零基础》__2 一个完整的程序
    java 网络编程
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/15341577.html
Copyright © 2011-2022 走看看