使用程式語言函式庫提供的 `Round()` 之類的函式對數值做四捨五入時,要小心它的捨入結果可能不是所預期的四捨五入,因而踩到雷。
來看看 Python 的:來看看 JavaScript 的:
最後看看 C# 的:
可以發現,對 1.5 跟 3.5 都是四捨五入到 2 與 4,可是在 Python 與 C# 中,對 2.5 的結果卻是 2。
來看看 JavaScript 的:
最後看看 C# 的:
可以發現,對 1.5 跟 3.5 都是四捨五入到 2 與 4,可是在 Python 與 C# 中,對 2.5 的結果卻是 2。
class Character : MonoBehaviour
{
protected CharacterData data;
...
}
class CharacterData : ScriptableObject
{
public float movingVelocity = 10.0f;
public float rotatingVelocity = 10.0f;
}
class Player : Character
{
public new PlayerData data;
private void Start()
{
base.data = data;
}
...
}
[CreateAssetMenu(fileName = "PlayerData",
menuName = "Scriptable Object/PlayerData", order = 1)]
class PlayerData : CharacterData
{
public float firingPeriod = 0.1f;
}
Unity 在編譯後會出現錯誤訊息,"The same field name is serialized multiple times in the class or its parent class. This is not supported: Base(Player) data":
>>> id(1)
10914496
>>> x = 1
>>> id(x)
10914496
def game_command(...):
if not game_is_started:
return
# Other jobs
但很快發現充滿重複的程式碼,而且影響程式碼的簡潔與維護的不方便。於是上網查找有無類似 C# 的 function attribute 的寫法,只要在函式的定義前加上像是 game_started 的 attribute,就可以控制該函式的行為。於是找到了 decorator (裝飾器)。if (value == 0)
printf("Grade S\n");
else if (value == 1)
printf("Grade A\n");
else if (value == 2)
printf("Grade B\n");
else if (value == 3)
printf("Grade C\n");
else
printf("Grade D\n");
可以用 switch-case 取代成:switch (value) {
case 0:
printf("Grade S\n");
break;
case 1:
printf("Grade A\n");
break;
case 2:
printf("Grade B\n");
break;
case 3:
printf("Grade C\n");
break;
default:
printf("Grade D\n");
break;
}
基礎複習完了,