我的程序的一部分需要在while循环内使用以下值:
0.1
0.2
0.3
…
0.9
所以我需要在循环中提供它们。 这是代码:
double x = 0.0;
while ( x<=1 )
{
// increment x by 0.1 for each iteration
x += 0.1;
}
我需要输出准确:
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
但这实际上给了我类似的东西:
0.1
0.2
0.300000000000000000000000004
0.4
0.5
0.6
0.799999999999999999999999999999
0.899999999999999999999999999999
0.99999999999999999999999999
欢迎来到浮点世界,那里的0.1不是0.1。问题在于,许多数字(包括0.1)无法精确表示在中double
。因此,实际上并不是x
每次循环都精确地添加0.1
。
一种方法是使用整数算术除以10:
int i = 0;
while (i <= 10) {
double x = i / 10.0;
. . .
i++;
}
另一种方法是制作x
一个BigDecimal
,您可以在其中指定所需的特定精度。它基本上是在做上面的循环(整数加小数位),但是打包成一个漂亮的类,里面有很多花哨的东西。哦,它具有任意精度。
我有一个jUnit测试断言两个双重对象与以下: 这很好,然后我决定将其改为使用原语double,结果发现它已被弃用,除非还提供了delta。 所以我想知道的是,在这个assertEquals中使用双对象或原语类型有什么区别?为什么使用没有增量的对象是可以的,但是使用没有增量的原语是不可取的?Java是否在后台做了一些已经考虑了默认增量值的事情? 谢谢
我想知道如何确定java分配的内存。我有一个内存要求有限的程序。当我分配一个具有特定大小的数组时,我注意到JVM分配的内存是这个大小的两倍: 例如:在分配数组之前: 此行后:char[]xxx=新char[4*1024*1024]; 因此,可用内存量从14 MB降至6 MB。即使我的阵列只有4 MB。我尝试过不同的东西数组,总是一样的。为什么java分配的数组大小是原来的两倍? 谢谢
双倍游戏C++ 说一下你最熟悉的语言的优缺点 创建一张表,插入数据,筛选数据,写出对应的sql语句 mysql数据库索引的数据结构是什么,为什么选这个? 请描述一下tcp三次握手和四次挥手的详细过程 请说明一下tcp什么会产生time_await,为什么产生,有什么危害吗,怎么解决? 如果将大量的小数据包合成在一起接受到的大数据包如何拆分为原来的小数据 给一个01字符串数据解密 冒泡排序或者选择排
问题内容: 我知道双重价值的内部代表是这样的。但是下面的代码仍然让我感到困惑。 码: 输出: 到底是怎么回事?加法,乘法进行得很好,但减法,除法则不好。谁能解释一下 加法为何与减法不同 ? 问题答案: 简短的答案是,对于浮点运算,您存在表示错误和舍入错误。在“知道”表示错误,所以如果没有舍入误差,你看不到它。但是,如果舍入误差太大,则可以。 解决方案是使用BigDecimal或舍入结果。 如果使用
问题内容: 当尝试将双精度型插入到Oracle表的 DOUBLE PRECISION 列中时,当双精度型超出范围时(在我的情况下:太小),我得到一个异常,但是只有在使用时(如果我使用normal ,它会四舍五入)到0)。 表: Java代码: 在插入/更新语句中使用双打之前,是否必须检查并四舍五入? 我可以以某种方式自动将值取整吗? 感谢您的任何见解/提示。 问题答案: = 如您在评论中指出的。
正如文档https://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/中所述,我试图将设置为自动增量,这几乎可以正常工作,但是当试图插入记录时,函数返回的值是,而不是,因此我尝试了以下更改。