关于浮点数(double和float)保留两位小数(要求四舍五入)

博客介绍了如何在C语言中处理浮点数(double和float),特别是如何保留两位小数进行四舍五入。作者通过示例展示了在不同情况下进行四舍五入操作的问题,并分享了一种使用0.5进行四舍五入的方法,强调了对于浮点数保留小数没有捷径,最可靠的方法是检查并判断小数点后相应位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(先上题目)

描述

依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩(注:输出成绩时需进行四舍五入且保留2位小数)。

输入描述:

学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。

输出描述:

学号,3科成绩,输出格式详见输出样例。

示例1

输入:

17140216;80.845,90.55,100.00

输出:

The each subject score of No. 17140216 is 80.85, 90.55, 100.00.

(本人菜鸟,代码看看就行)

#include<stdio.h>
int main()
{
    int id; float arr[3];
    scanf("%d;%f,%f,%f", &id, arr, arr + 1, arr + 2);
    for (int i = 0; i < 3; i++)
    {
        arr[i] += 0.005;
        arr[i] *= 100;
        int tmp = arr[i]; 
        arr[i] = tmp / 100.0;
    }
    printf("The each subject score of No. %d is %.2f,%.2f,%.2f",
        id,
        *arr,
        *(arr + 1),
        *(arr + 2));
    return 0;
}

(此时运行结果无问题,下面换上double)

(而此时运行后却没有成功进一)

   随后上网搜索,有老铁说比如保留两位时给第三位直接加上0.005。然而我只知道保留正整数的时候可以加0.5,负整数就减去0.5。

手动测试:

 (结果好像是正确的,可把我高兴坏了,终于把这玩意搞懂了。结果又测了两下:)

 

(换上double)

 

 

  发现就很。。。。。然后又找了好一阵,发现了一位大佬的宝藏博客。大佬在他的博客中列举了许多相关测试的例子,总结出来浮点数的保留真就没啥捷径。最笨的办法就是把小数点后所要保留位数的下一位数给取出来,判断大小,四舍五入。笨方法虽然麻烦(吐槽),但绝对不会有问题。

下面附上用0.5来进行四舍五入的方法:(保留整数)

#include <stdio.h>

int main()

{

    double d;

    scanf("%lf", &d);

    if (d >= 0){

         int a=d+0.5;

        printf("%d\n",a);

    }

    else

    {

        int a=d-0.5;

        printf("%d\n",a);

    }

    return 0;

}

### Java 中实现 Double 类型截取两位小数且不四舍五入 在 Java 中可以通过 `Math.floor` 或者字符串操作来实现双精度浮点数保留两位小数而不进行四舍五入的操作。以下是具体代码示例: ```java public class Main { public static void main(String[] args) { double num = 123.456; double result = Math.floor(num * 100) / 100; // 将数字乘以100后再向下取整,最后除以100恢复原 System.out.println(result); // 输出结果为123.45 } } ``` 上述方法通过将原始数值放大一百倍再利用 `Math.floor()` 函数去除多余的小数部分[^2]。 --- ### C++ 中实现 Double 类型截取两位小数且不四舍五入 C++ 可以采用类似的逻辑处理方式,即先将数值扩大到适当比例后应用地板函数(floor),然后再缩小回原来的规模。 ```cpp #include <iostream> #include <cmath> // 引入数学库用于调用 floor 方法 using namespace std; int main() { double number = 987.654; double truncatedNumber = floor(number * 100) / 100; // 同样原理:放大->取整->还原 cout << fixed << truncatedNumber << endl; // 使用fixed确保输出固定小数数 return 0; } ``` 此段程序同样实现了对指定置之后的数据直接丢弃的效果而不是按照常规方式进行近似计算。 --- ### Python 中实现 Float 类型截取两位小数且不四舍五入 对于 Python 来说,则可以借助于内置模块 decimal 的功能或者简单的字符串切片技巧完成这一目标。 #### 方法一:Decimal Module Approach ```python from decimal import Decimal, ROUND_DOWN def truncate_float(value, precision=2): factor = Decimal(10) ** precision return float(Decimal(str(value)).quantize(factor, rounding=ROUND_DOWN)) num = 123.456 result = truncate_float(num) print(result) # 结果应显示为 '123.45' ``` 这里我们创建了一个辅助函数用来接受任意实参并返回经过修约后的版本。注意此处采用了向下的方向来进行调整[^4]。 #### 方法二:String Manipulation Technique 另一种更简便的方式就是把浮点数转化为字符串形式然后手动选取所需的片段重新组合成新的数值对象。 ```python def truncate_to_two_places(flt): flt_str = "{:.3f}".format(flt)[:-1] # 转化为三小数字符串后去掉最后一个字符 return float(flt_str) value = 765.432 output_value = truncate_to_two_places(value) print(output_value) # 应该打印出'765.43' ``` 这种方法虽然简单易懂但是可能存在一些边界情况需要注意处理好以免引发错误行为。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也要写bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值