На этом шаге мы рассмотрим способы реализации такого преобразования.
Теперь, когда мы посчитали остатки денег у игрока, осталось преобразовать баланс обратно в золотые и серебряные монеты. Обновите код performPurchase(), чтобы преобразовать оставшуюся у игрока сумму в золото и серебро. (Не забудьте добавить в начало файла инструкцию import kotlin.math.roundToInt.)
import kotlin.math.roundToInt . . . . . val remainingGold = remainingBalance.toInt() val remainingSilver = (remainingBalance % 1 * 100).roundToInt() playerGold = remainingGold playerSilver = remainingSilver displayBalance()
Рис.1. Перевод серебра в золото (Tavern.kt)
В этом примере использовались две функции преобразования, доступные для типа Double. Функция toInt() отбрасывает дробную часть значения. Эффект действия этой функции также называется потерей точности. Часть исходных данных теряется, потому что вы попросили вернуть целочисленное представление дробного числа, а целочисленное значение не такое точное.
Обратите внимание, что вызов toInt() для Double действует иначе, чем вызов toInt() для строки вида "5.91", который приводит к исключению. Разница в том, что при преобразовании строки в Double ее сначала нужно проанализировать и преобразовать в числовой тип, в то время как для числовых типов, таких как Double или Int, дополнительного анализа не требуется.
В нашем случае remainingBalance равен 4.18999999999999999995, поэтому вызов toInt() даст результат - 4. Это остаток золота у игрока.
Далее вы преобразуете дробную часть в остаток серебра:
val remainingSilver = (remainingBalance % 1 * 100).roundToInt()
Тут вы применили оператор деления по модулю, который находит остаток от деления одного числа на другое. Операция % 1 отбросит целую часть remainingBalance (часть, которая без остатка делится на 1), и оставит нам дробную часть. Ну и наконец, вы умножили остаток на 100 для перевода в серебро и вызвали roundToInt() для получившегося значения 18.99999999999995. Функция roundToInt() округляет до ближайшего целого, поэтому остается 19 серебряных монет.
Запустите Tavern.kt снова, чтобы увидеть слаженную работу таверны:
Madrigal speaks with Taernyl about their order. Madrigal buys a Dragon's Breath (shandy) for 5.91. Player's purse balance: Gold: 10 , Silver: 10 Total purse: 10.1 Purchasing item for 5.91 Remaining balance: 4.19 Player's purse balance: Gold: 4 , Silver: 19 Madrigal exclaims Ah, d3l1c10|_|s Dr4g0n's Br34th!
Рис.2. Результат работы приложения
В этих шагах вы поработали с числовыми типами в Kotlin и научились обрабатывать две основные разновидности чисел: целые и дробные. Вы также узнали, как выполнять преобразования между разными типами и какие возможности поддерживает каждый тип. В следующих шагах будут рассмотрены стандартные функции Kotlin - набор полезных функций, доступных для всех типов.
На следующем шаге мы рассмотрим операции работы с битами.