本文转自---http://demon.tw/programming/c-round.html

C语言标准库中有没有round函数?答案是,可能有,也可能没有。这取决于你使用的编译器,更准确地说,是编辑器是否支持C99标准。

让我们简单回顾一下C语言标准的历史:C的第一个标准是由美国国家标准协会(ANSI)发布的。虽然这份文档后来被国际标准化组织(ISO)采纳并且ISO发布的修订版也被ANSI采纳了,但名称ANSI C(而不是 ISO C)仍被广泛使用。

C89

1983年,美国国家标准协会组成了一个委员会,X3J11,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,并在作为ANSI X3.159-1989 "Programming Language C"正式生效。这个版本的语言经常被称作"ANSI C",或有时称为"C89"(为了区别C99)。

C90

在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会采纳为ISO/IEC 9899:1990。这个版本有时候称为C90。因此,C89C90通常指同一种语言。

C99

在ANSI的标准确立后,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化创建过程中继续发展壮大。《标准修正案一》在1995年为C语言创建了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广得国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。它通常被称为C99。C99被ANSI于2000年3月采用。

虽然C99标准已经确立了十多年,但是却没有流行起来。各个公司对C99的支持所表现出来的兴趣不同。当GCC和其它一些商业编译器支持C99的大部分特性的时候,微软和Borland却似乎对此不感兴趣。而且很多人似乎连C99这个标准都没有听说过,现实中广泛使用的C语言标准仍然是C98,ANSI C也似乎成为了C98的代名词。

除了GCC完全兼容C99标准以外,目前大部分C编译器都不支持或者部分支持C99标准。即使是最新的Visual C++ 2010也仅支持一小部分C99,更不用说Windows 98那个年代发布的Visual C++ 6.0了(那时候C99标准都没有)。既然不支持C99,自然也就没有C99新增的标准库函数round。说了那么多废话,还是得自己写一个。我那么懒,当然不会自己去写,到PHP源码中抄了一份,在ext\standard\math.c文件中。

#include <stdio.h>
#include <float.h>
#include <math.h>#define zend_isinf(a)   ((_fpclass(a) == _FPCLASS_PINF) || (_fpclass(a) == _FPCLASS_NINF))
#define zend_isnan(x)   _isnan(x)static double php_round(double val, int places) {double t;double f = pow(10.0, (double) places);double x = val * f;if (zend_isinf(x) || zend_isnan(x)) {return val;}if (x >= 0.0) {t = ceil(x);if ((t - x) > 0.50000000001) {t -= 1.0;}} else {t = ceil(-x);if ((t + x) > 0.50000000001) {t -= 1.0;}t = -t; }x = t / f;return !zend_isnan(x) ? x : t;
}int main(int argc, char *argv[])
{double d = php_round(5.055, 2);printf("%f\n", d);return 0;
}

需要指出的是_fpclass和_isnan函数并不是C标准库函数,而是VC运行时库中的函数,即VC对C标准库的拓展,不具有可移植性。

C语言标准库中round函数相关推荐

  1. mysql c语言数字转字符串函数_C++_c语言标准库中字符转换函数和数字转换函数,字符转换为数字: #includest - phpStudy...

    c语言标准库中字符转换函数和数字转换函数 字符转换为数字: #include atoi();将字符转换为整型   例:char ch1;int i=atoi(ch1); atol();将字符转化为长整 ...

  2. python round函数_python中round函数如何使用

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

  3. Go 语言标准库中 atomic.Value

    在 Go 语言标准库中,sync/atomic包将底层硬件提供的原子操作封装成了 Go 的函数.但这些操作只支持几种基本数据类型,因此为了扩大原子操作的适用范围,Go 语言在 1.4 版本的时候向sy ...

  4. mysql round不四舍五入_MySQL中ROUND函数进行四舍五入操作陷阱分析

    本文实例讲述了MySQL中ROUND函数进行四舍五入操作陷阱.,具体如下: 在MySQL中, ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本 ...

  5. SQL中Round函数没有四舍五入

    先来看下面SQL执行结果: select cast(CAST(ROUND(nvl(0.987689,0)*100,2) AS DECIMAL(4,2)) AS STRING) num; select ...

  6. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  7. Py之Numpy:Numpy库中常用函数的简介、应用之详细攻略

    Py之Numpy:Numpy库中常用函数的简介.应用之详细攻略 目录 Numpy库中常用函数的简介.应用 1.X, Y = np.meshgrid(X, Y) 相关文章 Py之Numpy:Numpy库 ...

  8. access四舍五入取整round_access中round函数怎么用

    access中round函数怎么用?access中round函数的用法!下面,小编通过示例来给大家介绍access中round函数的用法. 工具/原料 access 2007 方法/步骤 打开acce ...

  9. code::blocks自动补全诸如socket或者其它一些库中的函数

    如何让Ubuntu/winxp下面的code::blocks自动补全诸如socket或者其它一些库中的函数,宏之类的东西: 在project的parser里面将这些library的头文件包含进去即可, ...

  10. matlab roundn函数_columns函数的使用方法 matlab中round函数具体用法

    Excel中column函数的使用方法是什么?其实小编会说分手是想被挽留,你却顺口祝小编自由. 只读属性,返回 TextStream 文件中当前字符位置的列号. 语法: =Column(referen ...

最新文章

  1. 机器学习常用损失函数小结
  2. html 模板引擎 热部署,springboot系列四、配置模板引擎、配置热部署
  3. 阿里云服务器如何加强服务器的安全?有哪些安全措施?
  4. asp.net mvc连接mysql_ASP.Net MVC连接MySQL和Code First的使用
  5. 剑指offer-用两个栈实现一个队列
  6. java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求
  7. WPF设置全局快捷键
  8. CVPR19 Oral 如何避免高置信度的错误预测?
  9. 可穿戴的手机!努比亚nubia-α国行版将于4月8日正式发布
  10. bootstrap分割式下拉菜单显示不全
  11. 第五天--表单与页面
  12. pyLDA系列︱考量时间因素的动态主题模型(Dynamic Topic Models)
  13. python判断素数的函数_python中判断素数的函数
  14. axios设置headers
  15. 产品 软件验收标准参考
  16. 不用网的cmd小游戏来啦
  17. 【C++】最近公共祖先 LCA
  18. 问题-fuxi job failed ,cased by:Invalid decimal format.
  19. MySQL 5.6 警告信息 command line interface can be insec
  20. STC12C5A60S2单片机-双串口通信

热门文章

  1. 先进事迹计算机维护与维修,汽车维修工先进事迹
  2. 考研英语近义词与反义词·三
  3. R语言学习记录:sample()函数
  4. 基于SSM框架的狼途汽车门店管理系统的设计与实现
  5. 济南技工学校计算机,济南华力科技技工学校
  6. Base64 编码整理
  7. Gary Gygax的倒台,密切关注Linux端口等
  8. Github删除历史提交记录的方法
  9. SpringBoot Mybatis Starter 解析
  10. 已解决:[emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forb