在下面的例子中是否有可能被0(或者无穷)分割? public double calculation(double a, double b) { if (a == b) { return 0; } else { return 2 / (a – b); } } 在正常情况下,当然不会。 但是如果a和b非常接近,由于计算精度会导致(ab)为0 ? 请注意,这个问题是针对Java的,但我认为它将适用于大多数编程语言。
我知道0.1十进制数不能完全用有限的二进制数来表示( 解释 ),所以double n = 0.1会失去一些精度,不会精确到0.1 。 另一方面, 0.5可以精确地表示,因为它是0.5 = 1/2 = 0.1b 。 话虽如此,可以理解的是,加三次 0.1不会给0.3所以下面的代码打印为false : double sum = 0, d = 0.1; for (int i = 0; i < 3; i++) sum += d; System.out.println(sum == 0.3); // Prints false, OK 但是那五点加0.1会给0.5呢? 以下代码打印true : double sum = 0, d = 0.1; for (int […]
浮点数据types是单精度32位IEEE 754浮点,双精度数据types是双精度64位IEEE 754浮点。 这是什么意思? 何时应该使用float而不是double,反之亦然?
我想在C#中保留两位小数的double值,我该怎么做? double inputValue = 48.485; 结束后 inputValue = 48.49; 相关: C# – 如何四舍五入小数点后两位小数(输出在页面上)
最近我不得不把序列化成文本,然后把它取回来。 价值似乎不是等值的: double d1 = 0.84551240822557006; string s = d1.ToString("R"); double d2 = double.Parse(s); bool s1 = d1 == d2; // -> s1 is False 但根据MSDN:标准数字格式string ,“R”选项应该保证往返安全。 往返(“R”)格式说明符用于确保转换为string的数值将被parsing回相同的数值 为什么会发生?
今天,我正在浏览一些C ++代码(由其他人编写),并发现这一部分: double someValue = … if (someValue < std::numeric_limits<double>::epsilon() && someValue > -std::numeric_limits<double>::epsilon()) { someValue = 0.0; } 我试图弄清楚这是否有道理。 epsilon()的文档说: 该函数返回1和最大值之间的差值,大于1,可以用[double]表示。 这是否也适用于0,即epsilon()是大于0的最小值? 或者有0和0 + epsilon之间的数字0 + epsilon可以用double来表示吗? 如果不是,那么是不是相当于someValue == 0.0的比较?
printf中double的正确格式说明符是什么? 是%f还是%lf ? 我相信它的%f但我不确定。 代码示例 #include <stdio.h> int main() { double d =1.4; printf("%lf", d); //is this wrong? }
C ++标准没有讨论float和doubletypes的底层布局,只讨论了它们应该表示的值的范围。 (这对签名types也是如此,这是两个赞美还是别的什么) 我的问题是:什么是技术用于序列化/反序列化PODtypes,如double和float以便携方式? 目前看起来唯一的方法就是让字面值代表(如“123.456”),double的ieee754布局在所有体系结构上都不是标准的。
可能重复: 如何将C ++中的double转换为string? 我想结合一个string和一个双和g ++是抛出这个错误: main.cpp:在函数'int main()'中: main.cpp:40:错误:types'const char [2]'和'double'的操作数无效到二进制'operator +' 这里是它抛出错误的代码行: storedCorrect [count] =“(”+ c1 +“,”+ c2 +“)”; storedCorrect []是一个string数组,c1和c2都是双精度的。 有没有办法将c1和c2转换为string,以允许我的程序正确编译?
我写财务应用程序,我经常决定使用双精度和使用小数。 我所有的math工作的数字不超过5位小数,不大于〜100,000。 我有一种感觉,无论如何,所有这些都可以表示为双打,而不是四舍五入的错误,但从来没有确定。 为了明显的速度优势,我会继续从小数切换到双打,除了在一天结束时,我仍然使用ToString方法将价格传递给交易所,并且需要确保总是输出数字I期望。 (89.99而不是89.99000000001) 问题: 速度优势真的和天真的testing一样大吗? (〜100次) 有没有办法保证ToString的输出是我想要的? 这是由我的号码总是可代表的事实保证? 更新:在我的应用程序可以运行之前,我必须处理大约100亿次的价格更新。为了明显的保护性原因,我现在已经用十进制实现了,但是打开它需要3个小时,双打会大大减less我的开启时间。 双打是否有安全的方法?