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他可能不如你所想的更多相关文章

  1. java中int,float,long,double取值范围,内存泄露

    java中int,float,long,double取值范围是多少? 写道 public class TestOutOfBound { public static void main(String[] ...

  2. Java中的float、double计算精度问题

    java中的float.double计算存在精度问题,这不仅仅在java会出现,在其他语言中也会存在,其原因是出在IEEE 754标准上. 而java对此提供了一个用于浮点型计算的类——BigDeci ...

  3. 【转】JAVA程序中Float和Double精度丢失问题

    原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽" ...

  4. 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 ...

  5. 不要在精确计算中使用float和double类型

    http://blog.csdn.net/androiddevelop/article/details/8478879 一  问题描述 float和double类型不能用于精确计算,其主要目的是为了科 ...

  6. Char、float、Double、BigDecimal

    Char初识 char: char类型是一个单一的 16 位 Unicode 字符 char 在java中是2个字节("字节"是byte,"位"是bit ,1 ...

  7. java float、double精度研究(转)

    在java中运行一下代码System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System.o ...

  8. 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新 ...

  9. Java中 float、double使用注意问题

    在java中运行一下代码 System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System. ...

随机推荐

  1. Linux服务器调教日常

    本文为Linux服务器调教日常,不保证正确. 1. sshd配置: https://www.cnblogs.com/byeyear/p/9289063.html 2. 禁止普通用户su 1. 编辑/e ...

  2. 【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和

    1.最大字段和问题 求一个序列最大连续子序列之和. 例如序列[-1,-2,-3,4,5,-6]的最大子段和为4 + 5 = 9. ①枚举法 int MaxSum(int n,int *a){ int ...

  3. Bootstrap 插件收集

    Bootstrap-Mutilselect  将下拉选项扩展支持多选以及多种选择方式 http://davidstutz.de/bootstrap-multiselect/ Bootstrap Sel ...

  4. Xtrabackup2.4.8备份、还原、恢复Mysql5.7.19实操(网络拷贝)

    环境:CentOS 6.7  + Mysql 5.7.19 + Xtraback 2.4.8 innobackupex常用参数: --user=USER 指定备份用户,不指定的话为当前系统用户 --p ...

  5. docker 批量删除

    杀死所有正在运行的容器docker kill $(docker ps -a -q) 删除所有已经停止的容器docker rm $(docker ps -a -q) 删除所有未打 dangling 标签 ...

  6. 八(第三篇)、主体结构元素——time元素、pubdate属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. java数据类型关系及关系

    java中有常见的基本数据类型和引用数据类型,基本数据类型为四类八种如下 整数型(byte,short,int,long) 浮点型(float,double) 字符型(char) 布尔型(boolea ...

  8. leetcode221

    int maximalSquare(vector<vector<char>>& matrix) { int height=matrix.size(); ) ; ].si ...

  9. 微信小程序 用户登录 服务器端(TP5.1)实现

    先来看官方提供的流程图: 客户端: 小程序客户端通过 wx.login() 获取登录code , 然后将code当做参数传递到服务器. getToken(){ var that = this; wx. ...

  10. 数据库设计,表与表的关系,一对多。One-To-Many(2)

    一对多:主键数据表中只能包含一个记录,而在其关系记录表中这条记录可以与一个或多个记录相关,也可以没有记录与之相关. 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系:一对多: ...