我们在业务逻辑中发现了一个有趣的案例,它完全打破了我们的逻辑,我们不明白为什么NSDecimalNumber
,也不Decimal
知道它的行为方式。
我的案例游乐场如下:
import Foundation
let pQuantity = Decimal(string: "0.2857142857142857")!
let pPrice = Decimal(string: "7.00000000000000035")!
let calced = NSDecimalNumber(decimal: pQuantity * pPrice * Decimal(integerLiteral: 100)) // 200
let decimal = calced.decimalValue // 199.9999999999999999999999999999995
let integer = calced.intValue // 0
NSDecimalNumber(decimal: Decimal(string: "199.9999999999999999999999999999995")!).intValue // 0
NSDecimalNumber(decimal: Decimal(string: "199.9999999999999995")!).intValue // 199
NSDecimalNumber(decimal: Decimal(string: "199.99999999999999995")!).intValue // 15
NSDecimalNumber(decimal: Decimal(string: "199.999999999999999995")!).intValue // -2
Run Code Online (Sandbox Code Playgroud)
在上面的游乐场代码中,如果您不想自己运行它,则如果向右滚动,您可以看到返回值。
在计算将这些数量平均分配多少以产生美观的价格时,我们需要将原始小数值、数量和价格暂时转换为整数。然而,在这种情况下,由于某种原因,我们不能,因为转换的初始步骤失败,产生一个0
而不是200
(是的,当前的代码会产生199
一个错误)。
为什么 NSDecimalNumber 根据小数位数(范围从-2
到 )返回这些奇怪的值199
?
我们的解决方案是在将内部计算放入 之前对其进行四舍五入 …
当我们意识到这是问题时,我和我的朋友试图在我们的代码中找到一个错误.
random_function(spawn_link(fun() -> worker(List, self(), Death) end));
Run Code Online (Sandbox Code Playgroud)
这是解决方案:
PID = self(),
random_function(spawn_link(fun() -> worker(List, PID, Death) end));
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么不能直接调用self()函数呢?是因为它是一个匿名函数还是某种特殊的Erlang?
我正在尝试在Elixir中为API编写一个CLI客户端,以便我可以登录API系统,获取计算所需的数据,然后注销.我已经定义了一个Packet.Login结构,它应该是我在解析我收到的JSON后最终得到的内部数据结构.
我正在使用Poison来解析JSON.问题是,似乎,由于API返回大写属性,我在打印或解析时无法匹配它们,因为Poison将返回带有这些大写键的地图.问题是我似乎不可能使用这样的别名.如果我尝试使用其他语法,
packet[:Token]
Run Code Online (Sandbox Code Playgroud)
它仍然不起作用,而是给我一个错误.但这次关于Packet.Login没有实现Access行为.我能理解这一部分,但不是第一个问题.而我正试图保持代码愚蠢的简单.
defmodule Packet.Login do
defstruct [:Data, :Token]
end
defimpl String.Chars, for: Packet.Login do
def to_string(packet) do
"Packet:\n---Token:\t\t#{packet.Token}\n---Data:\t#{packet.Data}"
end
end
loginPacket = Poison.decode!(json, as: %Packet.Login{})
IO.puts "#{loginPacket}"
Run Code Online (Sandbox Code Playgroud)
在尝试编译上面的时候我得到了这个:
** (CompileError) lib/packet.ex:31: invalid alias: "packet.Token". If you wanted to define an alias, an alias must expand to an atom at compile time but it did not, you may use Module.concat/2 to build it at runtime. If instead you wanted to invoke a function or access a field, wrap the …
Run Code Online (Sandbox Code Playgroud) 我正在 Erlang 中制作一个游戏服务器,我希望能够为每个连接的客户端拥有一个进程。该进程应该负责处理客户端发送到服务器的所有 UDP 消息,处理这些消息并在必要时进行回复。
我该如何实现这一目标?我知道使用 TCP 我可以放置任意数量的侦听器来运行该函数
gen_tcp:accept(ListenSocket)
Run Code Online (Sandbox Code Playgroud)
它会阻塞工作人员,直到有工作可用,等等。我也希望 udp 具有这种行为,但我一直在尝试制作一个简单的示例,该示例会生成一个新进程,该进程应该根据其 ip 和每个 udp 数据包来匹配端口,查看哪个玩家发送了它,将其占为己有并忽略其余的。
loop({Sock, Ip, Port}) ->
receive
{udp, Sock, Ip, Port, Msg} ->
do_stuff & loop, etc.
end
end.
Run Code Online (Sandbox Code Playgroud)
这与从循环到消息的 Ip 匹配吗?为了实现这一点,我需要任何其他 UDP 侦听器来与该特定数据包不匹配,以便工作程序在任何给定时间获取它应该获取的每条消息,对吗?如果另一个“通用”UDP 侦听器侦听,它可能会在工作人员之前拾取消息。
所以我问这种方法是否有效,或者是否会收到错误消息,指出它不是套接字的所有者或类似的内容。到目前为止,我还没有让任何工作人员实际接收任何消息,所以我不确定这是因为不匹配还是因为套接字只向当前控制进程发送消息,我想这会使我的计划变得不可能。
快乐的程序员!
我有一个计划今天尝试学习一些C++,所以我想我可以从之前的课程中学习一个旧的C语言,并在C++中做同样的事情.作业是读取音乐文件并从ID3标签中检索数据,并根据他们的艺术家,专辑和曲目标题等对文件夹进行排序......这并不重要,但你至少知道我的目标.
所以我玩了一些套装,让我的程序收到一个字符串数组,指定不同的歌曲,它将循环算法.
在下一步中我遇到了困难,因为我试图复制旧C程序的行为,这是一个包含三个值的结构:
int size;
char *tag_name;
char *data;
Run Code Online (Sandbox Code Playgroud)
但到目前为止,我一直无法在C++中重新创建这种动态行为,我希望只定义成员但未初始化,因为我希望以后能够更改此数据.从技术上讲,我可以在创建标记之前从文件中获取数据,然后为构造函数提供初始值并完成它.但我能以我想要的方式做到吗?
class Tag {
public:
std::string name;
std::string data;
int size;
Tag() {}
Tag(std::string n, std::string d, int s) : name(n), data(d), size(s) { }
void setData(std::string data) { this.data = data }
};
Run Code Online (Sandbox Code Playgroud)
由于我已经尝试了十亿种指针和诸如此类的东西(Google搜索加载),我刚刚回到上面并决定问你如何实现这一目标.
我的脑筋是完全捣碎的,但考虑上面的伪代码,因为我敢打赌它在任何方面都不正确......
所以我的问题是:如何定义一个类,以便为成员名称和数据获得动态字符串分配?我几乎想要使用一些好的旧char*但我尝试这个的重点是学习一些C++,所以我现在强迫自己完成这个.