我有不同的股票及其價格,我想將它們存盤在例如 std::map 或 std::unordered_map 中:
struct Stock
{
...
};
using stock_price_t = double;
std::map<stock_price_t, Stock> ordered_stocks;
std::unordered_map<stock_price_t, Stock> unordered_stocks;
在字典中使用雙鍵或存在更好的解決方案是個好主意嗎?
uj5u.com熱心網友回復:
Astd::map使用doubles 作為鍵沒有問題。它用于<比較鍵并且兩個鍵在 時是等價的!(a < b) && !(b < a)。沒關系。當您期望浮點數準確而實際上并非如此時,問題確實會出現。
例如:
std::map<double,int> m{{0.3,0},{1.0,2},{2.0,2},{3.0,3}};
for (const auto& e : m) std::cout << e.first << " " << e.second << "\n";
輸出是:
0.3 0
1 2
2 2
3 3
但現在考慮一下:
auto it = m.find(0.1 0.2);
if (it == m.end()) std::cout << "not found\n";
搜索0.1 0.2將找不到鍵0.3,因為doubles 不準確,輸出為
not found
TL;DR:不要使用浮點數作為價格或貨幣。當您需要美分價格時,請使用int美分:
std::map<int, Stock> ordered_stocks;
for (const auto& e : ordered_stocks) {
std::cout << "dollars: " << e.first / 100 << "\n";
std::cout << "stock: " << e.second << "\n";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/412204.html
標籤:
