1、double和float存储的是不精确的数值
2、new InputStreamReader(System.in))是将系统输入(System.in本身是字节流)封装为字符流,
BufferedReader是缓冲的字符流

解决方案 »

  1.   

    浮点数是没法100%精确的,即使是在最大最小范围之内。原因很简单,无论int(32bit), long(64), float(32), double(64)都是用二进制来表示数的,有多少bit,就代表这种类型最多能精确表示 2^N 种可能的值。整数由于在其最大最小范围内的个数是有限的,所以这个范围内任何一个整数都可以100%精确地表示出来。而浮点数由于涉及到小数,而小数的个数是无穷的(哪怕这个范围只是正负1),因此用有限个精确值去表示无数种可能,必然结果是绝大部分是不精确的。比如你这个例子中1.21000....2这个就是个能用二进制浮点型精确表示出来的数字,
    而1.21恰巧就是属于那绝大部分,无法精确表示出来的数字。至于规律吗,不清楚但是有一点是肯定的,就是浮点数的精确值的分布是以0为中心的正态分布(或近似),也就是越接近0,精确数的个数就越多,绝对值越大,相邻两个精确值之间的间隔就越大。如果一定要精确计算,请使用java.math.BigDecimal,它是以十进制为基础的,(理论上)可以精确表示任何数,至少是有理数