对于棒球中的投球统计,我们有以下内容:
1/3 等于 1 个出局,2/3 等于 2 个出局,3/3 等于 3 个出局。
当你有 3 个出局时,它被认为是 1 个完整的一局。
如果您有 5 个出局,则被视为 1 局和 2/3 局。
在 excel 的专栏中,我把投手每场比赛投的局数
正如你在表格中看到的那样,投手 Juanito Perez 投了 4 次,第一次投了 2/3,第二次投了 1/3,第三次投了 5 2/3,最后一次投了 3 1/3,这一切意味着他有总共投了10局。
我需要的是以下内容,现在我必须使用小数而不是处理分数,也就是说,现在 1/3 等于 .1,2/3 等于 .2,3/3 等于 1。
换句话说,以表格为例,现在我必须这样说:
我怎样才能赚到这笔钱?
我用 C# 编写了这段代码
double[] entradas = { 0.2, 0.1, 5.2, 3.1 };
int enteros = 0;
double tercios = 0.0;
for(int i = 0; i < 4; i++)
{
enteros += (int)Math.Truncate(entradas[j]);
double num1 = tercios - Math.Truncate(tercios);
double num2 = entradas[j] - Math.Truncate(entradas[j]);
double tercio = num1 + num2;
if (tercio == 0.3)
{
if(Math.Truncate(tercios) > 0)
tercios += (0.3 * 10) / 3;
else
tercios = (0.3 * 10) / 3;
}
else
tercios += (entradas[j] - Math.Truncate(entradas[j]));
}
double total = enteros + tercios;
Console.WriteLine(total);
Console.ReadKey();
这里的问题是,当您添加 .2 + .1 时,它给了我 0.30000000000000004 并且在逻辑上不满足条件,为什么当它应该给我 0.3 时却给我这个结果?
你不能用一个公式来做到这一点,你可以这样做:
B 列使用 INT 函数输出数字的整数部分。C 列使用以下公式:
=(A1-TRUNC(A1))*3.33
。然后在总计中,您只需将 C 列的结果四舍五入并将其添加到 B 列。您需要做的第一件事是获取剧集的整数部分和剧集的小数部分,并将它们分别添加到单独的累加器中。然后小数部分或三分之和必须验证它是否能被 3 整除,但这一切都可以用一个简单的公式来完成。
我留给你的例子非常简单,在循环内部唯一要做的就是获取剧集的整数值并将它们相加。对三分之一进行同样的操作,将差乘以十 (10) 以获得三分之一的小数点的整数值。最后,得到情节和三分之一的总和。
现在重要的部分是剧集的总计算:
episodiosCompletos
+ Math.Truncate(terciosCompletos / 3D) + ((terciosCompletos % 3) / 10D)
先前计算的循环内的剧集。episodiosCompletos +
Math.Truncate(terciosCompletos / 3D)
+ ((terciosCompletos % 3) / 10D)
现在三分之二的数量除以 3 并提取它的整个值,这样我们就得到了三分之二内的剧集数。episodiosCompletos + Math.Truncate(terciosCompletos / 3D) +
((terciosCompletos % 3) / 10D)
这部分很重要,因为如果三分之和不是可被 3 整除的值,则获得除以 3 的其余部分以获得剩余情节的三分之二,但由于返回的是整数,所以它结束了除以 10。如果将其传递给 Excel,同样适用。
结果:
公式:在 C# 中进行的计算相同。请注意,在 excel 中使用该函数
RESIDUO
(它在英语中的对应物是 MOD),在 C# 中使用百分比符号 (%
) 来获得除法的余数。更新: 正如我在评论中所说的(我没有在 php 中编程),但是,对于为什么它给你其他小数的问题产生了疑问,所以我在互联网上搜索了如何创建 a
array
,如何使用 afor
以及什么是php中的对应物Math.Truncate
,所以我转向aphp fiddle online
并设法做到了这一点。到目前为止,它对我来说一直很好。