C++;十进制检查语句是否有错误? 我正在为C++课程做一些作业,而且我对C++还很陌生。我的if语句遇到了一些问题。。。我要做的是让用户输入一个时间,在0.00到23.59之间。:被一个句号替换。顺便说一句,该部分有效。然后,我将时间和分钟分开,并检查它们以确保它们处于有效的约束中。检查小时工作,但不是分钟。。。这是我的密码: minute= startTime - static_cast<int>(startTime); hour= static_cast<int>(startTime); //check validity if (minute > 0.59) { cout << "ERROR! ENTERED INVALID TIME! SHUTTING DOWN..." << endl;; return(0); } if (hour > 23) { cout << "ERROR! ENTERED INVALID TIME! SHUTTING DOWN..." << endl;; return(0); } minute=startTime-静态广播(startTime); 小时=静态播放(开始时间); //检查有效性 如果(分钟>0.59){ cout
浮点运算(C++;十进制检查语句是否有错误? 我正在为C++课程做一些作业,而且我对C++还很陌生。我的if语句遇到了一些问题。。。我要做的是让用户输入一个时间,在0.00到23.59之间。:被一个句号替换。顺便说一句,该部分有效。然后,我将时间和分钟分开,并检查它们以确保它们处于有效的约束中。检查小时工作,但不是分钟。。。这是我的密码: minute= startTime - static_cast<int>(startTime); hour= static_cast<int>(startTime); //check validity if (minute > 0.59) { cout << "ERROR! ENTERED INVALID TIME! SHUTTING DOWN..." << endl;; return(0); } if (hour > 23) { cout << "ERROR! ENTERED INVALID TIME! SHUTTING DOWN..." << endl;; return(0); } minute=startTime-静态广播(startTime); 小时=静态播放(开始时间); //检查有效性 如果(分钟>0.59){ cout,c++,if-statement,casting,C++,If Statement,Casting,浮点运算(float和double)本质上是模糊的。在发送到流的舍入表示中,小数点后面总是有一些数字是您看不到的,并且比较也可能是模糊的,因为您习惯于使用的表示(十进制)不是计算机使用的(二进制) 将时间表示为int-hours和int-minutes,您的问题就会消失。大多数库以滴答(通常为秒或微秒)为单位测量时间不要提供子刻度分辨率。你最好模仿它们。比较浮点数容易失败,因为很少有浮点数可以精确地用基数2表示。总是有可能两个不同的数字在不同的方向上取整 最简单的解决方法是在比较的数字上加上一个
float
和double
)本质上是模糊的。在发送到流的舍入表示中,小数点后面总是有一些数字是您看不到的,并且比较也可能是模糊的,因为您习惯于使用的表示(十进制)不是计算机使用的(二进制)
将时间表示为
int-hours
和int-minutes
,您的问题就会消失。大多数库以滴答(通常为秒或微秒)为单位测量时间不要提供子刻度分辨率。你最好模仿它们。比较浮点数容易失败,因为很少有浮点数可以精确地用基数2表示。总是有可能两个不同的数字在不同的方向上取整
最简单的解决方法是在比较的数字上加上一个非常小的模糊因子:
if (minute > 0.59 + epsilon)
请参阅。永远不要使用double(或float)存储两个整数值,使用整数和小数部分作为分隔符。小数数据类型不够精确,因此可能会产生错误的结果(在四舍五入的情况下)
在您的情况下,一个好的解决方案是使用结构(或对)甚至整数
对于integer,您可以使用then倍数的mod或div来提取实际值。例如:
int startTime = 2359;
int hour = startTime / 100;
int minute = startTime % 100;
尽管使用struct,代码看起来更简单,更容易理解(和维护)。您无法与
0.59
这个值进行精确比较
无法在计算机中表示。您正在进行比较
非常接近于0.59
的某个东西
非常接近0.59
就我个人而言,我根本不会以这种方式输入时间。这是一个非常重要的问题
更好的解决方案是学习如何使用std::istream
来
读取值。但是如果您坚持,并且您有startTime
as
您的加倍
,需要将其乘以100.0
(以便
您感兴趣的值中有一个是整数,可以是
精确表示),然后将其四舍五入,然后将其转换为
整数,并在
整数来提取您的值。大致如下:
assert( startTime >= 0.0 && startTime <= 24.0 );
int tmpTime = 100.0 * startTime + 0.5;
int minute = tmpTime % 100;
int hour = tmpTime / 100;
断言(startTime>=0.0&&startTime使用double
,而不是int
。请注意,家庭作业
标记已被弃用。抱歉,我键入了错误的标记。请再次查看:dsimple put。不要使用浮点数进行时间计算。将分钟和小时分别存储在int
变量中。请阅读我同意wi这是你的第一句话,但它表示的类型是从某个时代开始的天数,在一个双
中,小数部分用于表示时间,这似乎相当普遍。(我不是说这是个好主意,而是说它很普遍。)@JamesKanze:AFAIK,当从某个纪元开始表示时,小数部分通常仅用于表示毫秒(或微秒),在大多数情况下,这是一个可以接受的近似值。不是在Excel中。我使用过Excel插件,时间以双精度表示,表示天数(和小数天)从1900年1月1日开始。可能是由于Excel的影响,这种格式在某些环境中似乎很普遍。Always是一个强有力的词。我敢打赌他不会对1.50
或2.25
@JamesKanze有任何问题。你只在所有情况下正确率为0.0000176%。我认为“Always”限定条件。@MrLister-如果您选择一个随机的十进制数字序列,当转换为double
时,该序列不会溢出,那么您将有一个可以精确表示为double
的值的概率为0。作为讨论的问题,我不会将浮点算术描述为“模糊”。它定义明确,可复制。正如你所说,用十进制思考会导致误解。也就是说,它是十进制数和浮点数之间的类比(假设二进制浮点数表示)这是模糊的。@PeteBecker:那不是真的。但是任何表示法都有一些可以精确表示的值(甚至是十进制)。但即使是十进制也不能精确表示所有的值。试着用十进制表示1/3。我相信“闲聊”(但多年前的课堂记忆是模糊的)通过将浮点数保留为两个整数(“分子”和“分母”)使用精确表示。