我知道这是一个非常普遍和基本的问题,但是其他线程并没有帮助我解决问题。我是C语言的新手,但是具有良好的python知识。
double pi = 4/1 - 4/3 + 4/5 - 4/7 + 4/9;
std::cout << "This is pi: " << pi;
所以这总是返回“ 3”。
我在其他线程中读到这是因为我正在使用整数进行计算,所以我尝试做类似的事情
double(4)/1 - 4/3 ...
double(4/1 - 4/3 ...)
double(4/1) - 4/3 ...
他们仍然返回3?为什么
答案 0 :(得分:7)
您需要确保在计算的每个步骤中使用浮点值,而不仅仅是在开始时使用。
使用原始代码:
double pi = 4/1 - 4/3 + 4/5 - 4/7 + 4/9;
在编译器方面,这分为几个步骤:
//Does not model any specific compiler, is only modeling the general sequence a compiler might follow
__compiler int r1 = 4 / 1; //4
__compiler int r2 = 4 / 3; //1
__compiler int r3 = 4 / 5; //0
__compiler int r4 = 4 / 7; //0
__compiler int r5 = 4 / 9; //0
double pi = 0;
pi += r1;
pi -= r2;
pi += r3;
pi -= r4;
pi += r5;
您看到问题了吗?
如果要确保此代码的行为符合预期,请将每个数字分别转换为double
,或就地将它们声明为浮点值。
double pi = 4.0/1 - 4.0/3 + 4.0/5 - 4.0/7 + 4.0/9;
这将产生您期望的行为。确保还要查看C++ rules for Operator Precedence。
答案 1 :(得分:1)
我们看不到您的所有尝试,尽管您处于正确的位置,但上面显示的尝试都不够。
这些部门中的每个部门都是截然不同的,并且彼此之间没有关系。因此,您需要将此修补程序应用于每个修补程序。
而且,当执行此操作时,强制转换结果是没有用的-您必须强制转换一个(或两个)操作数。
例如
yyyy-MM-dd'T'HH:mm:ss'Z'
仅针对除以一的方法并不会取得太大的成就。 ;)
一种更简单的方法是完全抛弃整数文字:
double(4)/1 - double(4)/3 ...
或者:
4.0/1 - 4.0/3 ...
或者:
4/1.0 - 4/3.0 ...
有了4.0/1.0 - 4.0/3.0 ...
,这些已经是浮点文字了,因此不需要强制转换。
从技术上讲,.0
不是必需的,但确实可以使事情变得更清楚。