Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何安全地将一个双转换为C++中的整数?_C++_Int_Double - Fatal编程技术网

如何安全地将一个双转换为C++中的整数?

如何安全地将一个双转换为C++中的整数?,c++,int,double,C++,Int,Double,有没有一种方法可以将double转换为整数,而不会在转换过程中产生任何意外错误?我在C++编程中读到了C++的编写者编写的编程原理和实践,它的双倍不能变成整数,但是我已经把它放到了测试中,并且它正确地转换了大约80%的时间。如果可能的话,没有任何风险的最好方法是什么 例如,这可以正确地转换 double bruh = 10.0; int a = bruh; cout << bruh << "\n"; 但事实并非如此 double bruh = 10.

有没有一种方法可以将double转换为整数,而不会在转换过程中产生任何意外错误?我在C++编程中读到了C++的编写者编写的编程原理和实践,它的双倍不能变成整数,但是我已经把它放到了测试中,并且它正确地转换了大约80%的时间。如果可能的话,没有任何风险的最好方法是什么

例如,这可以正确地转换

double bruh = 10.0;
int a = bruh;
cout << bruh << "\n";
但事实并非如此

double bruh = 10.9;
int a = bruh;
cout << bruh << "\n";

简言之,它不会自动取整,因此我认为这就是它不安全的原因。

不可能将所有的双精度转换为整数而不会丢失数据

首先,如果double包含一个分数部分42.9,那么该分数部分将丢失


其次,double可以保存比大多数整数大得多的值范围,大约为1.7e308,因此当您输入较大的值时,您将无法将其存储为整数。

不可能在不丢失数据的情况下将所有double转换为整数

首先,如果double包含一个分数部分42.9,那么该分数部分将丢失

其次,double可以比大多数整数保存更大的值范围,大约是1.7e308,因此当你进入较大的值时,你就不能将它们存储到整数中

将双精度转换为整数而不冒任何意外错误风险的方法 简而言之,它不会自动循环,所以我认为这就是它不安全的原因

要转换为整数值,请执行以下操作:

x = round(x);
要转换为整数类型,请执行以下操作:

从一个像long lrounddouble x;这样的圆形函数开始;。它返回的整数值在值上最接近于x,中间的情况从零取整

如果舍入结果超出了长期范围,则会出现问题,代码可能希望首先对此进行测试

// Carefully form a double the is 1 more than LONG_MAX
#define LONG_MAXP1 ((LONG_MAX/2 + 1)*2.0)

long val = 0;
if (x - LONG_MAXP1 < -0.5 && x - LONG_MIN > -0.5) {
  val = lround(x);
} else {
  Handle_error();
}
细节:为了测试double是否在从四舍五入到长的范围内,仔细测试端点很重要。数学有效范围为长_MIN-0.5。。。LONG_MAX+0.5,但这些端点可能无法精确表示为双精度。相反,代码使用附近的LONG_MIN和LONG_MAXP1,它们的大小是2的幂,很容易精确地表示为双精度

将双精度转换为整数而不冒任何意外错误风险的方法 简而言之,它不会自动循环,所以我认为这就是它不安全的原因

要转换为整数值,请执行以下操作:

x = round(x);
要转换为整数类型,请执行以下操作:

从一个像long lrounddouble x;这样的圆形函数开始;。它返回的整数值在值上最接近于x,中间的情况从零取整

如果舍入结果超出了长期范围,则会出现问题,代码可能希望首先对此进行测试

// Carefully form a double the is 1 more than LONG_MAX
#define LONG_MAXP1 ((LONG_MAX/2 + 1)*2.0)

long val = 0;
if (x - LONG_MAXP1 < -0.5 && x - LONG_MIN > -0.5) {
  val = lround(x);
} else {
  Handle_error();
}

细节:为了测试double是否在从四舍五入到长的范围内,仔细测试端点很重要。数学有效范围为长_MIN-0.5。。。LONG_MAX+0.5,但这些端点可能无法精确表示为双精度。相反,代码使用附近的LONG_MIN和LONG_MAXP1,它们的大小是2的幂,很容易精确地表示为双精度。

也许你应该说明你的意思。显然,如果double大于最大整数,它将不起作用。您的两个示例都起作用。规则是小数部分被扔掉。C++从C中得到很多行为。对我来说没有意义,因为这种行为是众所周知的。有一些函数可以完成从double到int的转换,这使您能够更好地控制转换。您可以编写自己的例程来进行转换,并在您施加的任何约束失败时提供assert或throw exception。我不确定您试图避免的风险是什么。你能解释一下吗?不是迂腐,但你所说的安全、适当、不受欢迎和风险是什么意思?没有一种正确的方法可以将double转换为整数。仅适用于应用程序所需的方式。好吧,我有点学究气,但我们需要学究气来理解你想要什么,也许你应该表现出你的意思。显然,如果double大于最大整数,它将不起作用。您的两个示例都起作用。规则是小数部分被扔掉。C++从C中得到很多行为。对我来说没有意义,因为这种行为是众所周知的。有一些函数可以完成从double到int的转换,这使您能够更好地控制转换。您可以编写自己的例程来进行转换,并在您施加的任何约束失败时提供assert或throw exception。我不确定您试图避免的风险是什么。你能解释一下吗?不是迂腐,但你所说的安全、适当、不受欢迎和风险是什么意思?没有一种正确的方法可以将double转换为整数。仅适用于应用程序所需的方式。可以
嗯,我是学究,但我们需要学究来弄清楚你想要什么有一种方法可以确保在转换它的时候,双回合至少结束了吗?假设double不大于整数的最大大小。std::round可能是一个开始。还有std::ceil和std::floor@drescherjm好的,谢谢。我还没有尝试过round函数,但我会看看它是否适合我。@Anthony我不会尝试该函数,我会阅读一些关于它的文档,看看它是否符合您的要求。从您描述的需要到目前为止,我想说ceil就是您想要的。@Anthony ceil向上取整,向上取整到最近的一个,可以是向上或向下。有没有办法确保在转换它时至少向上取整?假设double不大于整数的最大大小。std::round可能是一个开始。还有std::ceil和std::floor@drescherjm好的,谢谢。我还没有尝试过round函数,但我会看看它是否适合我。@Anthony我不会尝试该函数,我会阅读一些关于它的文档,看看它是否符合您的要求。从你描述到目前为止的需求来看,我想说ceil就是你想要的。@Anthony ceil向上取整,向上取整到最近的一个,可以是向上的,也可以是向下的。