找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 263|回复: 20
打印 上一主题 下一主题
收起左侧

这个C语言程序 数据类型转换是不是有什么问题?

[复制链接]
跳转到指定楼层
楼主
ID:705846 发表于 2024-4-21 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大家,
下面的if(watt < jiyiwatt*(1-set3/100.0)) 这个判定有时有效,有时无效。

是不是数据类型转换的时候有问题。

#define uchar unsigned char
#define uint unsigned int

uint jiyiwatt,watt;
uchar set3=10;

if(watt < jiyiwatt*(1-set3/100.0)){ // set3是下调百分比
        state = 3;
        sdown = 0;
        }else {
        npp = 1;
        state = 1;
        }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2024-4-21 20:04 | 只看该作者
10/100=0这么简单的常识都不懂才会犯这种低级错误。
回复

使用道具 举报

板凳
ID:705846 发表于 2024-4-21 21:02 来自手机 | 只看该作者
Hephaestus 发表于 2024-4-21 20:04
10/100=0这么简单的常识都不懂才会犯这种低级错误。

请问应该怎么修改一下
回复

使用道具 举报

地板
ID:883242 发表于 2024-4-21 21:07 | 只看该作者
samxon 发表于 2024-4-21 21:02
请问应该怎么修改一下

不知道你的数据范围,无法修改。
回复

使用道具 举报

5#
ID:712493 发表于 2024-4-21 21:08 | 只看该作者
Hephaestus 发表于 2024-4-21 20:04
10/100=0这么简单的常识都不懂才会犯这种低级错误。

这个有小数点,愿意是不是弄小数点判断?
回复

使用道具 举报

6#
ID:883242 发表于 2024-4-21 21:26 | 只看该作者
fj51hei 发表于 2024-4-21 21:08
这个有小数点,愿意是不是弄小数点判断?

只要set3=10是整形(char/int/long),那么set3/100必然等于0,无论100有没有小数点。
回复

使用道具 举报

7#
ID:705846 发表于 2024-4-21 21:34 来自手机 | 只看该作者
Hephaestus 发表于 2024-4-21 21:07
不知道你的数据范围,无法修改。

set1的范围是1-99。得到的结果应转成整形。 jiyiwatt*(1-set3/100.0)应转成整形。谢谢!
回复

使用道具 举报

8#
ID:1088185 发表于 2024-4-21 21:54 | 只看该作者
if(watt < jiyiwatt*(1-set3/100.0))
改为
if(watt < (jiyiwatt*(1-set3)/100))
回复

使用道具 举报

9#
ID:883242 发表于 2024-4-21 22:52 | 只看该作者
1600277881 发表于 2024-4-21 21:54
if(watt < jiyiwatt*(1-set3/100.0))
改为
if(watt < (jiyiwatt*(1-set3)/100))

又错了,运算符乘除法比加减法优先级高,是小学就应该学过的。
回复

使用道具 举报

10#
ID:1088185 发表于 2024-4-21 23:03 | 只看该作者
Hephaestus 发表于 2024-4-21 22:52
又错了,运算符乘除法比加减法优先级高,是小学就应该学过的。

是的,这是看错了,应该是
if(watt < jiyiwatt*(1-set3/100.0))
if(watt < (jiyiwatt-jiyiwatt*set3/100.0))

回复

使用道具 举报

11#
ID:705846 发表于 2024-4-21 23:12 来自手机 | 只看该作者
set3是一个整数,程序原意是通过除100将百分比转换成小数,再用1减。
回复

使用道具 举报

12#
ID:705846 发表于 2024-4-22 07:02 来自手机 | 只看该作者
1600277881 发表于 2024-4-21 23:03
是的,这是看错了,应该是
if(watt < jiyiwatt*(1-set3/100.0))
if(watt < (jiyiwatt-jiyiwatt*set3/1 ...

watt < jiyiwatt*(1-set3/100.0))没什么区别吧。
回复

使用道具 举报

13#
ID:1109793 发表于 2024-4-22 07:17 | 只看该作者
要么int,要么char,为啥非要/100?把前边的数都*100,也就不用最后除100了,这样不就是都是int了?
回复

使用道具 举报

14#
ID:517951 发表于 2024-4-22 07:32 | 只看该作者
c语言中, 整形变量可以比较大小, 浮点数据是不能直接比大小的. 这个也要注意.
回复

使用道具 举报

15#
ID:384109 发表于 2024-4-22 07:34 | 只看该作者
数据强制类型转换
回复

使用道具 举报

16#
ID:705846 发表于 2024-4-22 08:48 | 只看该作者
谢谢大家回复,大家能不能告诉一下,下面每一步算出来的数是什么类型,值是多少。
set3的取值范围是5-99,
这一步计算出来的值
jiyiwatt*(1-set3/100.0)


#define uchar unsigned char
#define uint unsigned int

uint jiyiwatt,watt;
uchar set3=10;



if(watt < jiyiwatt*(1-set3/100.0)){ // set3是下调百分比
        state = 3;
        sdown = 0;
        }else {
        npp = 1;
        state = 1;
        }
回复

使用道具 举报

17#
ID:883242 发表于 2024-4-22 11:27 | 只看该作者
jiyiwatt*(1-set3/100.0)改成
(jiyiwatt*(100-set3))/100
回复

使用道具 举报

18#
ID:1088185 发表于 2024-4-22 12:57 | 只看该作者
samxon 发表于 2024-4-22 07:02
watt < jiyiwatt*(1-set3/100.0))没什么区别吧。

你试过了么?试过后你再下结论吧
回复

使用道具 举报

19#
ID:705846 发表于 2024-4-22 13:29 | 只看该作者
这样似乎解决了,还在测试中,高手们看看到底解决没解决呢,
if(watt < (uint)(jiyiwatt*(100-set3)/100))
回复

使用道具 举报

20#
ID:1088185 发表于 2024-4-22 14:06 | 只看该作者
samxon 发表于 2024-4-22 13:29
这样似乎解决了,还在测试中,高手们看看到底解决没解决呢,
if(watt < (uint)(jiyiwatt*(100-set3)/100))

如果说set3的范围是0..100, 这种写法解决不了,只是把你碰到的问题移位了,不信你试试
回复

使用道具 举报

21#
ID:1088185 发表于 2024-4-22 14:11 | 只看该作者
samxon 发表于 2024-4-22 13:29
这样似乎解决了,还在测试中,高手们看看到底解决没解决呢,
if(watt < (uint)(jiyiwatt*(100-set3)/100))

if(watt < (jiyiwatt-jiyiwatt*set3/100.0))

用excel 把范围设定好,对比一下这几个方式的误差就优劣了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表