java 小心使用float和double他可能不如你所想
public static void main(String[] args) {
double funds=1.00;
int itemBought=;
//
double price=.;
for(price=.;funds>=price;price+=.){
funds-=price;
itemBought++;
}
//#解释1
// 第一次 price=0.1 funds=1.00
// #1 #2 #3
// for(double price=.1;funds>=price;price+=.10)
//不经过#2,#3 price仍然为0.1 进入for循环 执行 funds-=prcie 此时funds=1 ,price=0.1 ,结果funds=0,9
// 第二次 执行#3 price+=0.1 得price=0.2 再执行#2 funds>=price 此时funds=0.9,price=0.2,结果为true 进入for循环 funds-=price 得funds=0.7
// 第三次 执行#3 price+=0.1 得price=0.30000000000000004 在执行#2 funds>=price 此时funds=0.7,price=0.30000000000000004(开始误差了) 结果为true 进入for循环 funds-=price 得 funds=0.3999999999999999
// 第四次 执行# price+=0.1 得price=0.4 再执行#2 funds>=price 此时funds=0.3999999999999999 ,price=0.4,结果为false 不进入循环体 所以itemBought结果为3
//#解释1
System.out.println(itemBought+" items bought.");
System.out.println("change:$"+funds);
}
对于误差解决办法是使用 BigDecimal,int或long进行货币计算,int和long涉及数值大小,
BigDecimal则用于对精度要求比较高的场合,下面我们使用BigDecimal写了个简单代码
package com.hra.riskprice;
import com.hra.riskprice.SysEnum.Factor_Type;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.math.BigDecimal;
import java.util.*;
@SpringBootApplication
public class RiskpriceApplication {
public static void main(String[] args) {
final BigDecimal TEN_CENTS=new BigDecimal(".10");
int itemBought=;
BigDecimal funds=new BigDecimal("1.00");
for(BigDecimal price=TEN_CENTS;funds.compareTo(price)>=;price=price.add(TEN_CENTS)){
funds=funds.subtract(price);
itemBought++;
}
System.out.println(itemBought+" items bought.");
System.out.println("change:$"+funds);
}
}
for循环什么执行的就不分析了,自己调试下加深映像就好,通常for的执行顺序都是如此,感谢观摩
java 小心使用float和double他可能不如你所想的更多相关文章
- java中int,float,long,double取值范围,内存泄露
java中int,float,long,double取值范围是多少? 写道 public class TestOutOfBound { public static void main(String[] ...
- Java中的float、double计算精度问题
java中的float.double计算存在精度问题,这不仅仅在java会出现,在其他语言中也会存在,其原因是出在IEEE 754标准上. 而java对此提供了一个用于浮点型计算的类——BigDeci ...
- 【转】JAVA程序中Float和Double精度丢失问题
原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽" ...
- Effective Java 48 Avoid float and double if exact answers are required
Reason The float and double types are particularly ill-suited for monetary calculations because it i ...
- 不要在精确计算中使用float和double类型
http://blog.csdn.net/androiddevelop/article/details/8478879 一 问题描述 float和double类型不能用于精确计算,其主要目的是为了科 ...
- Char、float、Double、BigDecimal
Char初识 char: char类型是一个单一的 16 位 Unicode 字符 char 在java中是2个字节("字节"是byte,"位"是bit ,1 ...
- java float、double精度研究(转)
在java中运行一下代码System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System.o ...
- java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)
java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...
- Java中 float、double使用注意问题
在java中运行一下代码 System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System. ...
随机推荐
- 第一个Unity3D脚本
学习就该简单粗暴,看了一天Unity3d的教程加文档,尝试一个小练习,再快速写个博客加深印象. 一:首先建立一个空白工程,创建一个空GameObject,在Assets Pannel中创建一个名为Le ...
- python调用linux的命令
有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...
- DBUS 的学习 概念清晰
dbus里面 name和path 怎么确定的,xml的不准确: 后来发现这个应该是在写debus server的时候自己制定的,xml只是理论上应该和这个保持一致 D-Bus三层架构 D-Bus是一个 ...
- java web 三大核心组件Filter
Filter 过滤: 定义: 过滤器是客户端与服务端之间的一道网,可以对请求的数据进行拦截和修改,同时也可以对,响应数据进行拦截和修改
- activate-power-mode效果实验(未完全成功)
原产地: Atom 支持版本一览 https://github.com/codeinthedark/awesome-power-mode 1.安装Atom:[ AtomSetup-x64.exe] 百 ...
- ARM920T的Cache
转载自:http://www.eefocus.com/mcu-dsp/242034 ARM920T有16K的数据Cache和16K的指令Cache,这两个Cache是基本相同的,数据Cache多了一些 ...
- 转:StarUML3.0的破解方法
转自:https://blog.csdn.net/sam_shan/article/details/80585240 StarUML3.0的破解方法 最近StarUML由2.0更新到3.0.原来的破解 ...
- JAVA方法参数传递
package demo.methodparamDemo; public class MethodParamsDemo { public static void main(String[] args) ...
- [Unity算法]点是否在多边形范围内
参考链接: https://www.zhihu.com/question/26551754 http://www.cnblogs.com/leoin2012/p/6425089.html 原理如下: ...
- JAVA 注解,泛型,反射获取泛型,并实例化
JAVA 的泛型加大了 编程的灵活性,在配合上反射,可以让我们省去大量的重复代码,当你用 SpringBoot 整合 JPA 的时候 你会发现,你的 DAO 层只需要继承 BaseDao,在显示标明泛 ...