2015-02-06 5 views
5

जब मैं "2.01" और "2.02" लिखता हूं तो निम्न कोड मुझे अलग-अलग परिणाम क्यों देता है?बूस्ट :: lexical_cast और डबल - अजीब व्यवहार

#include <boost/lexical_cast.hpp> 

#include <iostream> 
#include <string> 

int main() 
{ 
    const std::string str = "2.02"; 

    try 
    { 
    const double b = boost::lexical_cast<double>(str) * 100.0; 
    std::cout << "double: " << b << '\n'; 
    const int a = boost::lexical_cast<int>(b); 
    std::cout << "int: " << a << '\n'; 
    } 
    catch (const std::exception& ex) 
    { 
    std::cerr << ex.what() << '\n'; 
    } 
} 

आउटपुट

double: 202 
int: 202 

लेकिन अगर मैं "2.01" करने के लिए "2.02" बदलने यह मेरा पीछा उत्पादन देता है:

double: 201 
bad lexical cast: source type value could not be interpreted as target 

क्यों?

मैं विजुअल स्टूडियो 2013 (एमएसवीसी -12.0) का उपयोग कर रहा हूं और 1.57 को बढ़ावा देता हूं।

अग्रिम धन्यवाद।

उत्तर

2

यह फ़्लोटिंग पॉइंट गलतता है।

कोई कोई बाइनरी फ़्लोटिंग पॉइंट में 2.01 का प्रतिनिधित्व नहीं करता है, इसलिए 100 से गुणा करने से पूर्णांक संख्या नहीं होती है।

आप इसे दृश्यमान बना सकते हैं: Live On Coliru

std::cout << "double: " << std::setprecision(18) << std::fixed << b << '\n'; 

प्रिंटों पूर्णांक के लिए

double: 200.999999999999971578 

रूपांतरण इस कारण के लिए विफल रहता है।

+0

समाधान इसे पहले दोगुना करने के लिए, और उसके बाद, सही होगा? – rubikonx9

+1

क्या ओपी के कोड में संख्यात्मक रूपांतरणों के लिए 'lexical_cast' का उपयोग किया जा सकता है? क्या यह केवल स्ट्रिंग-जैसी प्रकार से रूपांतरणों के लिए डिज़ाइन नहीं किया गया है? –

+1

@ g.tsh सं। समाधान दशमलव प्रतिनिधित्व या अभिन्न अंकगणित का उपयोग करना होगा। और इस तथ्य को न भूलें कि दशमलव प्रतिनिधित्वों में अभी भी सटीक सीमाएं हैं (जैसे 10/3 = 3.333333 ...) – sehe

संबंधित मुद्दे