如果我们编译运行下面这个程序会看到什么? public class Test  {    public static void main(String args[]) {                System.out.println(0.05 + 0.01);        System.out.println(1.0 - 0.42);        System.out.println(4.015 * 100);        System.out.println(123.3 / 100…
本人前段时间做一个社区电商应用,发现了一个 天坑   ...................让我哭会 . 下面听听我的踩坑之路吧 ,电商肯定跟¥打交道了,计算少不了的.由于本人太菜 单纯的以为  float  double 可以直接参与加减乘除 感觉这种代码万无一失没去想这么多直接 float*int . 之前简单测试没问题,项目上线后自己偶然才发现的(不知道公司测试干嘛的) ,当选择多件商品时 , 还是直接说现象吧 比如 在代码中    0.1 f  * A         A为int 型  …
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法,比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数.而Java中浮点数采用的是IEEE 754标准. IEEE 754 这里就不细说什么是IEEE 754了,就直接讲具体内容,有兴趣的可以自己百度. fl…
float x = 302.01f;    System.out.println(x == 302.01); //false  System.out.println(x == 302.01f); //true    double y = 302.01;  System.out.println(y == 302.01); //true  System.out.println(y == 302.01f); //false    float z = 302.00f;  System.out.print…
一.问题的提出: 如果我们编译运行下面这个程序会看到什么?public class Test{    public static void main(String args[]){        System.out.println(0.05+0.01);        System.out.println(1.0-0.42);        System.out.println(4.015*100);        System.out.println(123.3/100);    }};你没…
在java中运行一下代码 System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System.out.println(2.00f-1.10f);输出结果:0.9 又正确了,为什么会导致这种问题?程序中为什么要尽量避免浮点数比较? 在java中浮点型默认是double的,及2.00和1.10都要在计算机里转换进行二进制存储,这就涉及到数据精度,出现这个现象的原因正是浮点型数据的精度问题.先了解…
为什么double转float不会出现数据误差,而float转double却误差如此之大?   double d = 3.14; float f = (float)d; System.out.println(f); 输出结果是:3.14; float f = 127.1f; double d = f; System.out.println(d); 输出结果是:127.0999984741211 为什么结果会是这样呢? 如何避免这样的问题发生,让float转double能得到实际的数据? 解决办法…
原文:C#中float的取值范围和精度 float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double. 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例中所示: float x = 3.5F; 如果在以上声明中不使用后缀,则会因为您尝试将一个 double值存储到 float 变量中而发生编译错误. float的取值范围 float占用4个字节,和int是一样,也就是32bit. 1bit(符号位) 8bits(指数位) 23bits(尾数位) 存储方式如下图: 取…
[本文相关的代码放在github上.地址为:https://github.com/VigourJiang/StructuredFloat] Java中double类型的格式基本遵循IEEE 754标准. 虽然数学意义上的小数是连续的.但double只能表示当中的一些离散点.把这些离散点组成的集合记为S.S的大小还是有限的.假设要保存的小数P刚好在集合S内,那么double类型就能精确的表示P:否则double类型只能从集合S中找一个与P近期的离散点P'取代P. 以上表述对于float也成立.IE…
double类型与float类型主要用于科学计算与工程计算而设计的,用于二进制浮点计算.对于普通计算通常是结果不准确的,所以对于普通的浮点数的加减法等,解决的方法需要用int,long,BigDecimal来计算.…
展开1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明.  其中,long类型最好以大写L来添加尾缀,因为小写l容易和数字1混淆.  例如: long lNum = 1234L; float fNum = 1.23f; double dNum = 1.23d; 这是Java语法规定,不添加尾缀很容易引起编译器报错,并且程序可读性也会变差.2. 不添加尾缀也不会报错的情况 Java语…
float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间 double是双精度类型,精度是17位有效数字,取值范围是10的-308次方到10的308次方,double占用8个字节的存储空间 当你不声明的时候,默认小数都用double来表示,所以如果要用float的话,则应该在其后加上f 例如:float a=1.3; 则会提示不能将double转化成float  这成为窄型转化 如果要用float来修饰的话,则应该使用float a…
目前java遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号.指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号. 我们来看一段java代码: public class FloatToBinary { public static void main(String[] args) { float f1=8.5f; System.out.println("f1底层数据(十进制):"+Float.floatTo…
代码如下: Double d1 = 0.35; Double d2 = 0.1; System.out.println(d1+d2); 结果很不幸不是0.45,而是0.44999999999999996 如果对于精度没有限制,我们当突然可是四舍五入的去计算,但如果涉及到RMB的计算,我们就要谨慎了. 所以在java中,我们不能使用double类型来做浮点运算. 解决方案: 使用 BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDec…
在工作中我发现了一个C#浮点数的精度问题,以下的程序运行结果并未得到我预期的结果: view source print? 01 namespace FloatTest 02 03     class Program 04      05         static void Main(string[] args) 06          07             double a = 0.0001; 08             float b = 0.1F; 09    10      …
float表示单精度浮点数在机内占4个字节,用32位二进制描述. double表示双精度浮点数在机内占8个字节,用64位二进制描述.浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分. 数符占1位二进制,表示数的正负. 指数符占1位二进制,表示指数的正负. 尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点 指数存指数的有效数字. 指数占多少位,尾数占多少位,由计算机系统决定. 可能是数符加尾数占24位,指数符加指数占8位 -- float. 数符加尾数占48位,指数…
原文网址:http://tjmljw.iteye.com/blog/1767716 起因:想把一个float[]转换成内存数据,查了一下,下面两个方法可以将float转成byte[]. 方法一 import java.nio.ByteBuffer; import java.util.ArrayList; float buffer = 0f; ByteBuffer bbuf = ByteBuffer.allocate(4); bbuf.putFloat(buffer); byte[] bBuffe…
float型在内存中占用的是4个字节的空间,而long型占用的是8个字节的空间. 注:float类型的范围是:一3.403E38~3.403E38.而long类型的范围是:-2^63~2^63-1(大概是9*10^18). 为什么4个字节的float型的最大值会大于long型的最大值呢? 一.代码演示1 class Demo { public static void main(String[] args) { float a=32.2f; long b=123456L; a=b; //隐式转换…
package com.zf.s2;//创建一个包   import java.math.BigInteger;//导入类 import java.util.ArrayList; import java.util.List;   public class TextFactorial {//操作计算阶乘的类     public static int simpleCircle(int num){//简单的循环计算的阶乘         int sum=1;         if(num<0){//…
在项目中经常需要使用计算文件的md5,用作一些用途,md5计算算法,通常在网络上查询时,一般给的算法是读取整个文件的字节流,然后计算文件的md5,这种方式当文件较大,且有很大并发量时,则可能导致内存打爆掉.所以如下代码提供了几种方式.并通过计算一个323M的文件的md5和大小给出了,GC的一些信息 代码 /* * Copyright (C) 2016. All Rights Reserved. */ package me.nabil.mixed; import org.apache.common…
日期的格式有很多形式,在使用过程中经常需要转换,下面是各种类型转换的使用例子以及日期计算方法的例子. 一.不同格式日期相互转换方法 public class TestDateConvertUtil { public static void main(String[] args) throws ParseException { // 获取当前时间 Date date = new Date(); // 获取当前时间 long timestamp = System.currentTimeMillis(…
package com.LBH; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import com.singularsys.jep.Jep; import com.singularsys.jep.bigdecimal.BigDecComponents; public class JieXi { public stati…
package study; public class testFloatDouble { public static void main(String[] args) { float f = 0; double d = 0; for (int i = 0; i < 10; i++) { f += 0.1; d += 0.1; } System.out.println("float类型: f = " + f); System.out.println("double类型:…
float floatA = 2.2f; ); ; i < ;++i ) { uint temp = 0x80000000 & (a << i); ) { Console.Write("0 "); } else { Console.Write("1 "); } } Console.WriteLine(); double doubleA = 2.2; ); ; i < ; ++i) { ulong temp = 0x8000000000…
1 public class Text { 2 3 public static void main(String args[] ){ 4 float x=123.45; 5 System.out.println(x); 6 } 7 } 不加F默认是double类型,取值范围从大范围(double)向小范围(float)需要强制转换,报错如下: 同理long类型也需要加L,不加默认int,赋值范围超过int类型取值范围不加L编译器报错,不超过int取值范围不会报错,因为不加L则默认为int型(fl…
代码: double d = -123456789012345.3426;//5898895455898954895989; NumberFormat nf = new DecimalFormat("#0.###"); nf.setMinimumFractionDigits(3);// 小数点后不足的补零:小数点之后最多3位数字 String amt = nf.format(d);// 将double类型的数格式化并转换成字符串,实际上进行了四舍五入 System.out.printl…
计算时间的时候碰到的问题: Date d = new Date(); long currtime = d.getTime(); //获取当前时间 long starttime = currtime - 30* 86400000; //当前时间减掉一个月的毫秒数搜索 System.out.println(currtime + "------"+starttime); 得到的结果竟然是currtime 要小于starttime,为什么会越减越大呢? //因为30* 86400000 超出i…
float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double. 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例中所示: float x = 3.5F; 如果在以上声明中不使用后缀,则会因为您尝试将一个 double值存储到 float 变量中而发生编译错误. float的取值范围 float占用4个字节,和int是一样,也就是32bit. 1bit(符号位) 8bits(指数位) 23bits(尾数位) 存储方式如下图: 取值范围基本表达法 (浮点)数值 = 尾数…
INT 确定最大/最小值 由于达到极限之后会变符号,直接循环判断条件即可 DOUBLE确定精度 设置一个DOUBLE变量初始值为1/3.0,每次*10,然后取整数部分,当两次的结果相同时说明已经到最大精度,记录此时计数器的数值 double d; d = /3.0; ;d >= ;i++) { )-() { printf(); break; } d *= ; } DOUBLE最大/最小值…
问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println("BigDecimal:"+new BigDecimal(Double.toString(4.015)).multiply(new B…