You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何实现仅在小数非零时显示一位小数?

实现按需格式化double数值输出的最优方法

你需要的是将double数值四舍五入到一位小数后,仅在小数部分非零时显示小数点及一位小数,否则显示整数。原代码使用fixed和setprecision(1)会强制输出一位小数(哪怕小数部分为0),因此无法达到预期效果。

核心思路

  1. 先将原始数值四舍五入到一位小数,确保输出精度符合要求;
  2. 判断四舍五入后的数值是否为整数:
    • 如果是整数,直接输出整数形式;
    • 如果不是,输出带一位小数的格式。

代码实现(考虑精度安全)

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    double numbers[3] = { 32943.14, 55772.04, 15310.58 };
    
    for(int i = 0; i < 3; i++){
        // 四舍五入到一位小数
        double rounded = round(numbers[i] * 10) / 10;
        
        double int_part;
        // 分离整数和小数部分
        double frac_part = modf(rounded, &int_part);
        
        // 考虑double精度误差,判断小数部分是否接近0
        if (abs(frac_part) < 1e-9) {
            // 输出整数
            cout << static_cast<long long>(int_part) << endl;
        } else {
            // 输出一位小数
            cout << fixed << setprecision(1) << rounded << endl;
        }
    }

    return 0;
}

代码说明

  • round(num * 10) / 10:实现对原始数值四舍五入到一位小数,比如55772.04会被处理为55772.0,15310.58会被处理为15310.6;
  • modf():将处理后的数值拆分为整数部分和小数部分,避免直接用rounded == floor(rounded)可能出现的精度问题;
  • abs(frac_part) < 1e-9:因为double类型的存储特性,整数的小数部分可能存在极小的误差,用这个条件判断可以安全识别整数情况;
  • 整数输出时用static_cast<long long>转换,避免数值过大时输出科学计数法。

另一种简洁实现(封装为函数)

如果需要复用格式化逻辑,可以封装成函数:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <cmath>

using namespace std;

string formatDouble(double num) {
    double rounded = round(num * 10) / 10;
    ostringstream oss;
    
    double int_part;
    double frac_part = modf(rounded, &int_part);
    
    if (abs(frac_part) < 1e-9) {
        oss << static_cast<long long>(int_part);
    } else {
        oss << fixed << setprecision(1) << rounded;
    }
    return oss.str();
}

int main() {
    double numbers[3] = { 32943.14, 55772.04, 15310.58 };
    
    for(double num : numbers){
        cout << formatDouble(num) << endl;
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:24:52