【问题标题】:Integer to double conversion整数到双倍转换
【发布时间】:2014-09-08 11:31:44
【问题描述】:

如何将整数转换为双精度?我有这段代码,它的结果是15,而不是15.45,这是因为程序将第一个数字作为结果的类型,在这个程序中是整数

#include <iostream>
using namespace std;

template < class T1 , class T2 >

T1 smaller ( T1 a, T2 b ){
    return (a<b?a:b); 
}

int main(){
    int x = 98;
    double y = 15.45;

    cout << smaller( x , y ) << endl; 


    return 0;
}

【问题讨论】:

  • 您的问题是什么?你有什么问题?
  • 嗯,1515.34 都不是正确的结果。正确的结果是15.45
  • 我写错了数字,不是程序的结果是 15 而不是 15.45
  • @T.C.这应该作为答案发布(并注意它需要 C++11,并且没有 C++11,Antonio 的回应是你能做的最好的)。

标签: c++ templates integer double


【解决方案1】:

这是因为您的返回类型是根据第一个输入参数的类型模板化的,在这种情况下是整数。

输入和输出的类型应该相同,并明确选择要在函数中使用的类型。例如:

template < class T >

T smaller ( T a, T b ){
    return (a<b?a:b); 
}

int main {
    int x = 98;
    double y = 15.45;

//    cout << smaller( x , y ) << endl; //This wouldn't compile. It would compile if x and y had the same type.
//    cout << smaller<int>( x , y ) << endl; //This would still return 15
    cout << smaller<double>( x , y ) << endl; 

}

正如 user2079303 提到的,您尝试实现的函数与标准库中可用的 std::min 函数非常相似。

【讨论】:

  • 是的,是的,我明白.. 我只是想知道这个问题的解决方案是什么,我改变了数字顺序
  • 提到这个函数已经存在于标准库中,名称为std::min,这可能是有用的。除了,标准版本有引用而不是副本作为参数和返回值,如果模板参数不仅仅是一个原语,这是相关的。
【解决方案2】:

在 C++11 中,您可以将尾随返回类型与 decltypestd::decay(或者 std::common_type)一起使用:

template < class T1 , class T2 >
auto smaller ( T1 a, T2 b ) -> typename std::decay<decltype(a<b?a:b)>::type {
    return (a<b?a:b); 
}

decay 是确保函数按值返回所必需的。由于您按值获取参数,因此无法返回引用。

在C++14中,可以使用返回类型推导:

template < class T1 , class T2 >
auto smaller ( T1 a, T2 b ) {
    return (a<b?a:b); 
}

在 C++11 之前,您可以编写一个非常复杂的 promotion_traits 类,其中包含许多特化来确定适当的返回类型并返回 typename promotion_traits&lt;T1, T2&gt;::type,或者您可以按照 Antonio 的建议和模板 smaller 合二为一而是模板参数,在这种情况下,它变为 std::min,但通过值而不是 const 引用传递。

【讨论】:

    【解决方案3】:

    在您的函数调用中,尝试将 x 转换为双精度值。

    (double)x //or
    static_cast<double>(x)
    

    【讨论】:

    • 我可以这样做吗,我也可以在浮动时使用它,或者长时间到来
    • @Lila 无论如何你都可以做到。即使号码已经是double,也可以安全地使用double
    猜你喜欢
    • 2020-10-11
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多