为什么我的数学不对
Why isn't my math right
我正在尝试制作一个简单的工具,您可以在其中跟踪您对 BTC 的投资。我拥有计算所有内容所需的所有数据,但当涉及到汇率变化时,我的 "investment total" 没有变化。这意味着当 BTC 上涨时,我赚了多少钱的结果几乎保持不变,而当它下跌时也一样。
我已经发布了我的代码并尝试了很多不同的解决方案,包括不同的类型:浮点数、小数、整数、双精度,结果总是一样的。我错过了什么?
编辑 - 代码:
namespace BTC_Profit_Projections
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Core c = new Core();
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
var ExchangeRate = c.GrabBTCAmount();
var AmountInBTC = (c.USDtoBTC(15000, ExchangeRate));
var AmountAtMarket = (AmountInBTC * ExchangeRate);
ListViewItem i = new ListViewItem("15000");
i.SubItems.Add(AmountInBTC.ToString());
i.SubItems.Add(AmountAtMarket.ToString());
i.SubItems.Add(ExchangeRate.ToString());
mainlist.Items.Add(i);
}
}
}
核心Class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace BTC_Profit_Projections
{
class Core
{
public decimal GrabBTCAmount()
{
WebClient w = new WebClient();
string btc = w.DownloadString("https://www.bitstamp.net/api/ticker/");
int pos1 = btc.IndexOf("last", 0);
int pos2 = btc.IndexOf(":", pos1);
int pos3 = btc.IndexOf(",", pos2);
return Convert.ToDecimal(btc.Substring(pos2 + 3, pos3 - pos2 - 4));
}
public decimal USDtoBTC(decimal money, decimal rate)
{
return money / rate;
}
}
}
不清楚为什么您希望这段代码有不同的行为。看看这些行:
var ExchangeRate = c.GrabBTCAmount();
var AmountInBTC = (c.USDtoBTC(15000, ExchangeRate));
var AmountAtMarket = (AmountInBTC * ExchangeRate);
如果我内联 USDtoBTC
并内联所有内容以计算 AmountAtMarket
,则公式将是
AmountAtMarket = (15000 / ExchangeRate) * ExchangeRate
所以你得到的 15000
应该总是有一些舍入误差。
错误似乎在您计算 AmountInBTC
的那一行。要计算 AmountInBTC
,您应该将您的投资金额(我假设 15000
)除以您进行投资时的汇率 而不是当前汇率。
我正在尝试制作一个简单的工具,您可以在其中跟踪您对 BTC 的投资。我拥有计算所有内容所需的所有数据,但当涉及到汇率变化时,我的 "investment total" 没有变化。这意味着当 BTC 上涨时,我赚了多少钱的结果几乎保持不变,而当它下跌时也一样。
我已经发布了我的代码并尝试了很多不同的解决方案,包括不同的类型:浮点数、小数、整数、双精度,结果总是一样的。我错过了什么?
编辑 - 代码:
namespace BTC_Profit_Projections
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Core c = new Core();
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
var ExchangeRate = c.GrabBTCAmount();
var AmountInBTC = (c.USDtoBTC(15000, ExchangeRate));
var AmountAtMarket = (AmountInBTC * ExchangeRate);
ListViewItem i = new ListViewItem("15000");
i.SubItems.Add(AmountInBTC.ToString());
i.SubItems.Add(AmountAtMarket.ToString());
i.SubItems.Add(ExchangeRate.ToString());
mainlist.Items.Add(i);
}
}
}
核心Class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace BTC_Profit_Projections
{
class Core
{
public decimal GrabBTCAmount()
{
WebClient w = new WebClient();
string btc = w.DownloadString("https://www.bitstamp.net/api/ticker/");
int pos1 = btc.IndexOf("last", 0);
int pos2 = btc.IndexOf(":", pos1);
int pos3 = btc.IndexOf(",", pos2);
return Convert.ToDecimal(btc.Substring(pos2 + 3, pos3 - pos2 - 4));
}
public decimal USDtoBTC(decimal money, decimal rate)
{
return money / rate;
}
}
}
不清楚为什么您希望这段代码有不同的行为。看看这些行:
var ExchangeRate = c.GrabBTCAmount();
var AmountInBTC = (c.USDtoBTC(15000, ExchangeRate));
var AmountAtMarket = (AmountInBTC * ExchangeRate);
如果我内联 USDtoBTC
并内联所有内容以计算 AmountAtMarket
,则公式将是
AmountAtMarket = (15000 / ExchangeRate) * ExchangeRate
所以你得到的 15000
应该总是有一些舍入误差。
错误似乎在您计算 AmountInBTC
的那一行。要计算 AmountInBTC
,您应该将您的投资金额(我假设 15000
)除以您进行投资时的汇率 而不是当前汇率。