我需要一个简单的浮点舍入函数,因此:
double round(double);
round(0.1) = 0
round(-0.1) = 0
round(-0.9) = -1
Run Code Online (Sandbox Code Playgroud)
我能找到ceil()和floor()在math.h中-但不是round().
它是以另一个名称存在于标准C++库中,还是缺少?
以下代码适用于Visual Studio 2008,有无优化.但它只适用于没有优化的G ++(O0).
#include <cstdlib>
#include <iostream>
#include <cmath>
double round(double v, double digit)
{
double pow = std::pow(10.0, digit);
double t = v * pow;
//std::cout << "t:" << t << std::endl;
double r = std::floor(t + 0.5);
//std::cout << "r:" << r << std::endl;
return r / pow;
}
int main(int argc, char *argv[])
{
std::cout << round(4.45, 1) << std::endl;
std::cout << round(4.55, 1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出应该是:
4.5
4.6
Run Code Online (Sandbox Code Playgroud)
但是带有优化(O1- O3)的g ++ …
给定一个任意有限的浮点数,有没有办法确定下一个可表示的浮点数?例如,给定1.0f,根据定义,下一个最大可表示的数字是1.0f + std :: numeric_limits <float> :: epsilon().有没有一种方法可以合成任何值的epsilon - 而不仅仅是1.0f - 而不需要依赖于对机器如何表示浮点值的位置和/或显式知识?
正如我解释它,MSDN的定义的numeric_limits::is_exact几乎都是假的:
在[this]类型上完成的[all]计算没有舍入误差.
而IBM的定义几乎总是正确的:(或圆形的定义,这取决于你怎么看它)
一种对其所有值都有精确表示的类型
我确定的是,我可以2在a double和a中存储一个,long而且它们都可以完全代表.
然后,我可以将它们分开,10并且两者都不会完全保持数学结果.
给定任何数值数据类型T,定义的正确方法是std::numeric_limits<T>::is_exact什么?
编辑:我已经从许多答案中提供的详细信息中发布了我认为对此问题的准确答案. 这个答案不是赏金的竞争者.
该值是将 2.01 和 2.52 之和除以 2 的结果(2.01 + 2.52) / 2。Excel 将该值显示为 2.265,当格式化为 2 位数字时,该值为 2.27。但是,文件中存储的值为 2.2649999999999997。当我重新创建这是 C# 时,我也在变量中得到该值,而不是 2.265。据我所知,这是由于 4.53 除以 2 的浮点精度问题造成的。
double result = (2.01 + 2.52) / 2;
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)
控制台显示 2.265,但 QuickWatch 调试器中显示的值显示 2.264999999999997。我怀疑 WriteLine 方法中将值转换为字符串可以纠正浮点精度错误。
当我申请时Math.Round(result, 2, MidpointRounding.AwayFromZero),结果并不2.26像2.27我预期的那样。似乎它查看了我想要四舍五入的数字右侧的第一个数字,发现它是 4,并忽略了它右侧的所有其他数字。问题在于,这些 9 只是由于精度问题而存在,并且需要包含在内,或者更好的是,该值应该是2.265。
我在代码中所做的就是从 Excel 电子表格中读取文本值"2.2649999999999997",将其转换为双精度型2.264999999999999,然后转换为字符串,这给了我"2.265". 然后我将其转换回双精度,2.265以便我可以将 应用于Math.Round它并获得 的预期结果2.27。这是完整的代码:
double result = Convert.ToDouble(((2.01 + 2.52) …Run Code Online (Sandbox Code Playgroud) 假设我有一个返回a的方法double,但我想确定要返回的值的点后的精度.我不知道变量的价值double.
例:
double i = 3.365737;
return i;
Run Code Online (Sandbox Code Playgroud)
我希望返回值在点之后具有3个数字的精度
含义:返回值为3.365.
另一个例子:
double i = 4644.322345;
return i;
Run Code Online (Sandbox Code Playgroud)
我希望返回值为: 4644.322