You need to enable JavaScript to run this app. C语言中double强制转换为short类型时结果变小的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

C语言中double强制转换为short类型时结果变小的问题咨询

问题原因分析
  • 根本原因是二进制浮点数精度误差:0.1无法被二进制double类型精确存储,你传入的b、c都是0.1的倍数,实际存储的数值和理论上的精确值存在微小的偏差。
  • 你看到的result值为30.000000是默认保留6位小数打印的结果,实际真实值是略小于30的数(比如29.999999999999996),可以用printf("%.15f\n", result);打印完整精度值验证。
  • C语言中浮点数强制转换为整数类型的规则是直接截断小数部分、只保留整数位,所以略小于30的浮点数转int或short时都会得到29,和转换顺序无关。
解决方案

你可以根据业务需求选择以下处理方式:

  1. 四舍五入后再转换
    调用<math.h>头文件中的round()函数对结果做四舍五入后再转整数,代码示例:
#include <math.h>
short calcDays(int a, double b, double c)
{
    double result = (double) (a* (b/c));
    short days = (short) round(result);
    return days;
}
  1. 加微小偏移量后再转换
    给计算结果加一个远小于业务最小精度的偏移量(比如1e-6),抵消浮点数的负向误差后再截断:
short calcDays(int a, double b, double c)
{
    double result = (double) (a* (b/c));
    short days = (short) (result + 1e-6);
    return days;
}
  1. 改用整数运算彻底避免误差
    因为b和c都是0.1的倍数,你可以将两个参数先放大10倍转为整数再计算,从根源上避免浮点数精度问题:
#include <math.h>
short calcDays(int a, double b, double c)
{
    long b_int = lround(b * 10);
    long c_int = lround(c * 10);
    long result = a * b_int / c_int;
    return (short) result;
}

内容的提问来源于stack exchange,提问作者Tamoghna Purkait

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 21:51:03