Long to double kotlin

Numbers

Kotlin provides a set of built-in types that represent numbers.
For integer numbers, there are four types with different sizes and, hence, value ranges:

9,223,372,036,854,775,807 (2 63 — 1)

When you initialize a variable with no explicit type specification, the compiler automatically infers the type with the smallest range enough to represent the value. If it is not exceeding the range of Int , the type is Int . If it exceeds, the type is Long . To specify the Long value explicitly, append the suffix L to the value. Explicit type specification triggers the compiler to check the value not to exceed the range of the specified type.

val one = 1 // Int val threeBillion = 3000000000 // Long val oneLong = 1L // Long val oneByte: Byte = 1

In addition to integer types, Kotlin also provides unsigned integer types. For more information, see Unsigned integer types.

Floating-point types

For real numbers, Kotlin provides floating-point types Float and Double that adhere to the IEEE 754 standard. Float reflects the IEEE 754 single precision, while Double reflects double precision.

These types differ in their size and provide storage for floating-point numbers with different precision:

Читайте также:  Set type string javascript

You can initialize Double and Float variables with numbers having a fractional part. It’s separated from the integer part by a period ( . ) For variables initialized with fractional numbers, the compiler infers the Double type:

To explicitly specify the Float type for a value, add the suffix f or F . If such a value contains more than 6-7 decimal digits, it will be rounded:

Unlike some other languages, there are no implicit widening conversions for numbers in Kotlin. For example, a function with a Double parameter can be called only on Double values, but not Float , Int , or other numeric values:

fun main() < fun printDouble(d: Double) < print(d) >val i = 1 val d = 1.0 val f = 1.0f printDouble(d) // printDouble(i) // Error: Type mismatch // printDouble(f) // Error: Type mismatch >

To convert numeric values to different types, use explicit conversions.

Literal constants for numbers

There are the following kinds of literal constants for integral values:

  • Decimals: 123
  • Longs are tagged by a capital L : 123L
  • Hexadecimals: 0x0F
  • Binaries: 0b00001011

Octal literals are not supported in Kotlin.

Kotlin also supports a conventional notation for floating-point numbers:

You can use underscores to make number constants more readable:

val oneMillion = 1_000_000 val creditCardNumber = 1234_5678_9012_3456L val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010

There are also special tags for unsigned integer literals.
Read more about literals for unsigned integer types.

Numbers representation on the JVM

On the JVM platform, numbers are stored as primitive types: int , double , and so on. Exceptions are cases when you create a nullable number reference such as Int? or use generics. In these cases numbers are boxed in Java classes Integer , Double , and so on.

Nullable references to the same number can refer to different objects:

All nullable references to a are actually the same object because of the memory optimization that JVM applies to Integer s between -128 and 127 . It doesn’t apply to the b references, so they are different objects.

On the other hand, they are still equal:

Explicit number conversions

Due to different representations, smaller types are not subtypes of bigger ones. If they were, we would have troubles of the following sort:

// Hypothetical code, does not actually compile: val a: Int? = 1 // A boxed Int (java.lang.Integer) val b: Long? = a // Implicit conversion yields a boxed Long (java.lang.Long) print(b == a) // Surprise! This prints «false» as Long’s equals() checks whether the other is Long as well

So equality would have been lost silently, not to mention identity.

As a consequence, smaller types are NOT implicitly converted to bigger types. This means that assigning a value of type Byte to an Int variable requires an explicit conversion:

All number types support conversions to other types:

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double

In many cases, there is no need for explicit conversions because the type is inferred from the context, and arithmetical operations are overloaded for appropriate conversions, for example:

Operations on numbers

Kotlin supports the standard set of arithmetical operations over numbers: + , — , * , / , % . They are declared as members of appropriate classes:

You can also override these operators for custom classes. See Operator overloading for details.

Division of integers

Division between integers numbers always returns an integer number. Any fractional part is discarded.

This is true for a division between any two integer types:

To return a floating-point type, explicitly convert one of the arguments to a floating-point type:

Bitwise operations

Kotlin provides a set of bitwise operations on integer numbers. They operate on the binary level directly with bits of the numbers’ representation. Bitwise operations are represented by functions that can be called in infix form. They can be applied only to Int and Long :

Here is the complete list of bitwise operations:

  • shl(bits) – signed shift left
  • shr(bits) – signed shift right
  • ushr(bits) – unsigned shift right
  • and(bits) – bitwise AND
  • or(bits) – bitwise OR
  • xor(bits) – bitwise XOR
  • inv() – bitwise inversion

Floating-point numbers comparison

The operations on floating-point numbers discussed in this section are:

  • Equality checks: a == b and a != b
  • Comparison operators: a < b , a >b , a = b
  • Range instantiation and range checks: a..b , x in a..b , x !in a..b

When the operands a and b are statically known to be Float or Double or their nullable counterparts (the type is declared or inferred or is a result of a smart cast), the operations on the numbers and the range that they form follow the IEEE 754 Standard for Floating-Point Arithmetic.

However, to support generic use cases and provide total ordering, the behavior is different for operands that are not statically typed as floating-point numbers. For example, Any , Comparable <. >, or Collection types. In this case, the operations use the equals and compareTo implementations for Float and Double . As a result:

  • NaN is considered equal to itself
  • NaN is considered greater than any other element including POSITIVE_INFINITY
  • -0.0 is considered less than 0.0

Here is an example that shows the difference in behavior between operands statically typed as floating-point numbers ( Double.NaN ) and operands not statically typed as floating-point numbers ( listOf(T) ).

Источник

Kotlin Type Casting with examples

Type casting is a process of converting one data type to another type, for example – converting int to long, long to double etc. In this tutorial we will learn how to do type conversion in Kotlin.

Type conversion in Kotlin vs Java

In java, one type is automatically converted to other type (in some cases), In Kotlin we need to explicitly convert the type.

For example:
Java:
Int is automatically converted to Long data type as long is larger than int.

// This code is valid in Java, even though we are converting int to long // because long is larger than int and it can hold integers int num1 = 101; long num2 = num1;

Kotlin:
In Kotlin the conversion is not automatic, we need to explicitly do the type conversion.

// This code is invalid in Kotlin. This will cause compile time // error, type mismatch val num1: Int = 101 val num2: Long = num1

Correct code in Kotlin:
We use the toLong() function to convert int to long in Kotlin.

val num1: Int = 101 val num2: Long = num1.toLong()

More functions for type conversion in Kotlin

In the above example, we have seen how we used toLong() function to convert an integer to Long type. Similarly we have other functions available in Kotlin to help us in type conversion.

1. toChar() – To convert a type to Char type.
2. toInt() – To convert a type to Int type.
3. toLong() – To convert a type to Long type.
4. toFloat() – To convert a type to Float type.
5. toDouble() – To convert a type to Double type.
6. toByte() – To convert a type to Byte type.
7. toShort() – To convert a type to Short type.

Simple Type Casting Examples

/** * created by Chaitanya for Beginnersbook.com */ package beginnersbook fun main(args : Array)< /** * Double to int type casting */ println("4.554 to int: " + (4.554.toInt())) /** * int to Char type casting */ println("66 to Char: " + (65.toChar())) /** * Char to int type casting */ println("B to int: " + ('B'.toInt())) >

Kotlin Type Casting

Output:

What happens when we convert a larger type to smaller type?

When converting a larger type to a smaller type, we have two possible outcomes. If the value that we are converting to a smaller type is outside the range of target type , the result is then truncated. However when the value is within the range of target type, it is converted without being truncated.

Example 1: When the value is outside the range of target type

In this example we are converting a long type to int type where the value of long type is outside the range of integer type.

Number num1 is: 5453448989999998988 Number num2 is: 2041161740

Example 2: When the value is within the range of target type

In this example we are converting a long type to int type where the value of long type is within the range of integer type.

Number num1 is: 5453448 Number num2 is: 5453448

About the Author

I have 15 years of experience in the IT industry, working with renowned multinational corporations. Additionally, I have dedicated over a decade to teaching, allowing me to refine my skills in delivering information in a simple and easily understandable manner.

Источник

Оцените статью